最近,我的任务是定制我们小组定期使用的其中一个应用程序。该应用程序是用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我能够得到一个基本的读者来测试我的管道,以及上面的基本代码来打开我的管道。
答案 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 +(在最后一行添加文本时写入和读取)