C中的FIFO(命名管道)

时间:2013-03-08 00:42:08

标签: c named-pipes fifo

最近,我的任务是定制我们小组定期使用的其中一个应用程序。该应用程序是用C语言编写的,我没有很多经验。我找到了一些我想要做的功能性例子,但是还没有将它完全集成到我的测试台中。

要求非常简单:打开命名管道并推出一些数据,以便另一个组可以读取管道并对其执行某些操作。必须这样做,它不会中断服务器做它的事情。

我的应用程序有一个名为history的数组,其中包含我所需的所有必要值。到目前为止,我对完成此操作的尝试结果好坏参半。请参阅下面的代码片段:

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 个答案:

答案 0 :(得分:3)

您在fprintf()行上收到的警告应该是一个提示。

如果您想使用fprintf(),则必须使用fopen()而不是open()打开FILE *

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

并使用fclose()关闭它。

答案 1 :(得分:0)

您需要对您的缓冲保持严密控制。我想setlinebuf()会有所帮助,但我总是喜欢使用snprintf()将变量格式化为缓冲区,并将write()完全置于我的控制之下。整条线一次。

printf()可能发生的事情是更大的缓冲区,一旦有足够的行累积而没有setlinebuf(),只有部分行会格式化。通过显式地使用带有足够小的缓冲区的write()来确保原子写入(检查本地操作系统的限制),可以确保不会拆分任何行。

读者需要非常小心,在读取这些分割线以注意这些分割线继续读到\ n时,但是每个人都在这里小心谨慎,这可能是你的问题

答案 2 :(得分: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));

我希望,这对你有帮助!

答案 3 :(得分:0)

这不会给你想要的

int fd;

用于文件任务

FILE *fd = fopen(fileName , option);

fileName,如temp.txt,database.txt

选项 - r(可读)

-w(可写)

-r +和w +(在最后一行添加文本时写入和读取)