Это лаба с иммитацией механизма клиент-сервер, дана как образец но серверная часть не фурычит. Канал (т.е.) файл 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;
}
>[оверквотинг удален]
> {
> ch = getchar(); //считать символ
> fputc(ch, file_fifo); //запись в канал
> if (ch == 10) fflush(file_fifo);//принудительная очистка буферов канала, в результате
> чего клиент считывает все переданные символы.
> } while (ch != 'q'); //ввод символов до символа 'q'
> fclose(file_fifo); //закрытие файла
> unlink(fifo); //удаление канала
> return 0;
> }Я знаю, что не так, а ты симпатичная?
> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии
> q не останавливается. поскажите что не такОн и не начинался. То, что ты видишь - echo из stdin.
1. Пока клиент не прицепился, fopen(fifo... блокируется
2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь
Enter в конце строки или не заполнишь все 4К буфера. То есть while ждёт
не "нажатия q", а строку или буфер, в котором попадётся q.Используй strace, чтобы понять, что происходит.
>> не фурычит. Канал (т.е.) файл fifo создается, но ввод при нажатии
>> q не останавливается. поскажите что не так
> Он и не начинался. То, что ты видишь - echo из stdin.
> 1. Пока клиент не прицепился, fopen(fifo... блокируется
> 2. stdin - буферизованый. getchar ничего тебе не отдаст, пока не нажмёшь
> Enter в конце строки или не заполнишь все 4К
> буфера. То есть while ждёт
> не "нажатия q", а строку или буфер, в котором
> попадётся q.
> Используй strace, чтобы понять, что происходит.1 - согласен, а буферизации stdin тут не видно.
Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)
> Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)Это ты Вове утром расскажешь...
>> Я вообще-то парень а подписался женским именем чтобы охотнее отвечали)
> Это ты Вове утром расскажешь...В принципе, вообще можно сказать такими словами - мол стдин буфферизируется, но это только следствие причины - режима терминала. Надо терминал переводить в non-canonical-режим - tcsetattr(..). То есть правовернее говорить "терминал не в том режиме".
попробуй исправить так:
file_fifo = fopen(fifo, "w");
на
file_fifo = fopen(fifo, "r+");