2013-03-08 1 views
2

Недавно я поручил настроить одно из приложений, которое наши группы используют довольно регулярно. Приложение написано на C, что не имеет большого опыта. Я нашел некоторые функциональные примеры того, что я пытаюсь сделать, но пока не смог полностью интегрировать его в тестовую кровать.FIFO (named pipe) в C

Требование довольно просто: откройте именованный канал и вытолкните некоторые данные, чтобы другая группа могла читать трубку и что-то делать с ней. Это необходимо сделать так, чтобы он не прерывал работу сервера.

Мое приложение имеет массив, называемый историей, который содержит все необходимые значения, которые я получаю после. Я до сих пор имел смешанные результаты с моими попытками добиться этого. Пожалуйста, смотрите ниже фрагмент кода:

DCmass_add_history(history, history_num); 

int fd; 
char * myfifo = "/tmp/fooPipe"; 

/* create the FIFO (named pipe) */ 
mkfifo(myfifo, 0666); 

/* open FIFO (named pipe) */ 
fd = open(myfifo, O_WRONLY); 
    for (i = 0; i < history_num; i++) { 

    /* Write our data to our FIFO (named pipe) */ 
    fprintf(fd, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

} 
close(fd); 

Я имел некоторый успех ранее при использовании write вместо fprintf, но не мог получить какие-либо переменные в мою трубу.

Из предыдущего примера переполнения стека, Stack Overflow example Я смог получить базового читателя для проверки моей трубы и базового кода сверху, чтобы открыть мой канал.

+4

'fprintf()' принимает 'ФАЙЛ *'; а не дескриптор 'int'. – WhozCraig

ответ

3

Предупреждение, которое вы получаете на линии fprintf(), должно быть подсказкой.

Если вы хотите использовать fprintf(), вы должны открыть FILE * для его использования fopen(), а не open():

FILE *fd = fopen(myfifo, "w"); 

и закрыть его с помощью fclose().

0

Вам необходимо поддерживать жесткий контроль над буферизацией. Я полагаю, setlinebuf() поможет, но мне всегда нравится использовать snprintf() для форматирования переменных в буфер и write(), которые полностью под моим контролем. Целые строки сразу.

Что может происходить с вами при печати с помощью printf() - это более крупные буферы, если достаточное количество строк накапливается без setlinebuf(), будет отформатирована только часть строки. Явным образом используя write() с буферами, достаточно маленькими, чтобы гарантировать запись атома (проверьте локальную ОС на лимиты), вы можете быть уверены, что никакая строка не разделяется.

Читатели должны быть очень осторожны при чтении FIFOs заметить такие линии разделения, чтобы продолжить чтение до \ п, но все правильно осторожны и такое может быть ваша проблема

0

Вы можете написать, как это, если вы хотите использовать FifoFile

char * mesg; 
// allocating for mesg; and then 

sprintf(msg, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

write(fd, msg, sizeof(msg)); 

Надеюсь, это полезно для вас!

0

это не даст вам хочу

int fd; 

для миссий файлов

FILE *fd = fopen(fileName , option); 

FileName как temp.txt, базы данных.TXT

вариант - г (читаемый)

-w (перезаписываемый)

-r + и W + (читать и писать с добавить на текст из последней строки)