2

最近,我的任务是定制我们小组经常使用的应用程序之一。该应用程序是用 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但无法将任何变量放入我的管道中。

从前面的堆栈溢出示例,堆栈溢出示例中,我能够得到一个基本的阅读器来测试我的管道,以及上面的基本代码来打开我的管道。

4

4 回答 4

3

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

如果你想使用,你必须使用它fprintf()打开一个,而不是:FILE *fopen()open()

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

并使用fclose().

于 2013-03-08T00:45:56.867 回答
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));

我希望,它对你有帮助!

于 2014-04-08T08:00:15.623 回答
0

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

使用 printf() 可能会发生更大的缓冲区,一旦在没有 setlinebuf() 的情况下积累了足够多的行,则只有部分行会格式化。通过显式使用 write() 和足够小的缓冲区以确保原子写入(检查本地操作系统的限制),您可以确保没有分割线。

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

于 2013-03-08T00:50:42.447 回答
0

这不会给你想要的

int fd;

文件任务

FILE *fd = fopen(fileName , option);

文件名,例如 temp.txt 、 database.txt

选项 - r(可读)

-w(可写)

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

于 2015-04-07T21:54:57.650 回答