Код на С не работает в Solaris (скажите что не так), varvara_88, 18-Май-11, 14:50 [смотреть все]Это лаба с иммитацией механизма клиент-сервер, дана как образец но серверная часть не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии q не останавливается. поскажите что не так#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #define fifo "./fifo" //объявление имени именованного канала int main(int argc, char * argv[]) { FILE * file_fifo; //структура для работы с файлом char ch; mkfifo(fifo, 0700); //создание канала, с именем fifo, с маской прав доступа 0700 file_fifo = fopen(fifo, "w"); //открытие канала на запись if (file_fifo == NULL) //обработка ошибки открытия { errno=EBADFD; //File descriptor in bad state perror(argv[0]); return -1; } do { ch = getchar(); //считать символ fputc(ch, file_fifo); //запись в канал if (ch == 10) fflush(file_fifo);//принудительная очистка буферов канала, в результате чего клиент считывает все переданные символы. } while (ch != 'q'); //ввод символов до символа 'q' fclose(file_fifo); //закрытие файла unlink(fifo); //удаление канала return 0; }
|
- Код на С не работает в Solaris (скажите что не так),
Вова, 15:36 , 18-Май-11 (1)>[оверквотинг удален] > { > ch = getchar(); //считать символ > fputc(ch, file_fifo); //запись в канал > if (ch == 10) fflush(file_fifo);//принудительная очистка буферов канала, в результате > чего клиент считывает все переданные символы. > } while (ch != 'q'); //ввод символов до символа 'q' > fclose(file_fifo); //закрытие файла > unlink(fifo); //удаление канала > return 0; > } Я знаю, что не так, а ты симпатичная? - Код на С не работает в Solaris (скажите что не так),
ACCA, 17:15 , 18-Май-11 (2)> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии > q не останавливается. поскажите что не так Он и не начинался. То, что ты видишь - echo из stdin. 1. Пока клиент не прицепился, fopen(fifo... блокируется 2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь Enter в конце строки или не заполнишь все 4К буфера. То есть while ждёт не "нажатия q", а строку или буфер, в котором попадётся q. Используй strace, чтобы понять, что происходит.
- Код на С не работает в Solaris (скажите что не так),
Вова, 17:34 , 18-Май-11 (3)>> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии >> q не останавливается. поскажите что не так > Он и не начинался. То, что ты видишь - echo из stdin. > 1. Пока клиент не прицепился, fopen(fifo... блокируется > 2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь > Enter в конце строки или не заполнишь все 4К > буфера. То есть while ждёт > не "нажатия q", а строку или буфер, в котором > попадётся q. > Используй strace, чтобы понять, что происходит.1 - согласен, а буферизации stdin тут не видно.
- Код на С не работает в Solaris (скажите что не так),
varvara_88, 18:58 , 18-Май-11 (4)Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)
- Код на С не работает в Solaris (скажите что не так),
ACCA, 19:13 , 18-Май-11 (5) +3 > Я вообще-то парень а подписался женским именем чтобы охотнее отвечали) Это ты Вове утром расскажешь...
- Код на С не работает в Solaris (скажите что не так),
Вова, 13:55 , 19-Май-11 (7)>> Я вообще-то парень а подписался женским именем чтобы охотнее отвечали) > Это ты Вове утром расскажешь... В принципе, вообще можно сказать такими словами - мол стдин буфферизируется, но это только следствие причины - режима терминала. Надо терминал переводить в non-canonical-режим - tcsetattr(..). То есть правовернее говорить "терминал не в том режиме".
- Код на С не работает в Solaris (скажите что не так),
q, 23:37 , 18-Май-11 (6)попробуй исправить так: file_fifo = fopen(fifo, "w"); на file_fifo = fopen(fifo, "r+");
|