FIFO (именованный канал) в C

Недавно мне поручили настроить одно из приложений, которые наши группы используют довольно регулярно. Приложение написано на 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, но не мог получить никакие переменные в свой канал.

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


person chuy08    schedule 08.03.2013    source источник
comment
fprintf() берет FILE*; не int дескриптор.   -  person WhozCraig    schedule 08.03.2013


Ответы (4)


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

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

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

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

person Community    schedule 08.03.2013

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

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

Читатели должны быть очень осторожны при чтении FIFO, чтобы заметить такие разделенные строки, чтобы продолжить чтение до \ n, но здесь все по-настоящему осторожны, и это может быть вашей проблемой

person Gilbert    schedule 08.03.2013

Вы можете написать так, если хотите использовать 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));

Надеюсь, это поможет вам!

person Ramazan    schedule 08.04.2014

это не даст вам хотеть

int fd;

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

FILE *fd = fopen(fileName , option);

fileName, например temp.txt, database.txt

опция - r (читается)

-w (доступный для записи)

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

person eemrah    schedule 07.04.2015