我对此感到困惑,我需要使用mkfifo创建命名管道(我知道如何做到这一点)之前的程序将使用fork来创建会做某事的子进程,但现在我必须用poll()代替fork来观看多个流(这是我没有得到的部分)。更详细地说,当我在终端中运行我的程序时,它应该制作mkfifo文件,然后等待流进入,因此只是停留在那里,而不是关闭。然后我打开一个新的终端,并需要将这个输入到终端"cat file1> (mkfifo文件的名称)"中,这应该做的是使程序读取file1中的数据,在mkfifo产生的任何输入管道上。我到处都找遍了,但就是找不到合适的地方。
这是我目前看到的
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include "battleFieldReader.h" //this is where all the data computation is done
main(int argc, char *argv[])
{
if (sscanf (argv[1], "%i", &N) !=1 )
{
printf ("ERROR: Please input an integer.n");
_exit(EXIT_SUCCESS);
}
struct pollfd pfd[2];
pid = getpid();
printf("pid=%dn",pid);
N = atoi(argv[1]);
signal(SIGTERM, removePipes);
int i;
char fileName[32];
char fileName2[32];
snprintf (fileName, sizeof(fileName), "%d_%di", pid, 0);
mkfifo(fileName, 0666);
pfd[0].fd = open(fileName, O_RDONLY | O_NDELAY);
pfd[0].events = POLLIN;
snprintf (fileName2, sizeof(fileName2), "%d_%do", pid, 0);
mkfifo(fileName2, 0666);
pfd[1].fd = open(fileName2, O_WRONLY | O_NDELAY);
pfd[1].events = POLLIN;
while(1)
{
int n;
n = poll(pfd, 2, 3000);
if(n < 1)
{
printf("waiting...n");
continue;
}
if(pfd[0].revents & POLLIN)
{
printf("testn");
/*ideally this is where i would put a method to compute data but its just an infinite loop, its suppose to stop, so it can do the same thing whenever another file comes on, but I dont know how to stop it either*/
}
}
}
发生的事情是我创建了一个管道2N次,一个用于输入,一个用于输出运行程序的进程id。然后等待,直到其中一个管道上有东西进来,然后吐出需要对文件数据执行的操作。谁能告诉我,我走的方向对不对?
poll
告诉您是否可以在不阻塞的情况下读取或写入文件描述符(或者如果fd处于非阻塞状态,则不会获得EAGAIN/EWOULDBLOCK结果)。
你的代码有一些明显的问题:
-
您说要创建2N个fifo,但是您只创建了2个。您的
pfd
数组也有固定大小为2。你需要一个更大的数组和循环来创建更多。 -
您打开一个
O_WRONLY
文件描述符来写入管道,但是随后您将events
字段设置为POLLIN
,这将测试可用的输入。你想要POLLOUT
测试输出的可能性 -
在你的处理循环中,你轮询两个fds,但是你只检查
pfd[0]
的可用性,然后你永远不会对它做任何事情。在pfd[0].revents & POLLIN
检查成功后,应该读取pfd[0].fd
。您还应该检查pfd[1].revents & POLLOUT
并将数据写入pfd[1].fd
,如果成功。