我对此很困惑,我需要使用mkfifo创建命名管道(我知道如何做)这个程序之前会使用fork创建可以做某事的子进程,但是现在我必须用poll()来观察多个流(这是我没有得到的部分)。更详细的说,当我在终端中运行我的程序时,它假设制作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=%d\n",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("test\n");
/*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运行程序。然后等到其中一个管道出现问题,然后吐出需要对文件数据做的事情。如果我朝着正确的方向前进,那么任何人都可以和我清楚。
答案 0 :(得分:1)
poll
告诉您是否可以在不阻塞的情况下读取或写入文件描述符(如果fd处于非阻塞状态,则无法获得EAGAIN / EWOULDBLOCK结果)。
您的代码存在许多明显的问题:
你说你想要创建2N fifos,但是你只创建2.你的pfd
数组的固定大小也是2。你需要一个更大的数组和循环来创造更多。
您打开O_WRONLY
文件描述符以写入管道,但随后将events
字段设置为POLLIN
,这将测试可用的输入。您希望POLLOUT
测试输出是否可用。
在您的处理循环中,您可以轮询两个fds,但只检查pfd[0]
的可用性,然后您就不会对它进行任何操作。在pfd[0].fd
检查成功后,您应该阅读pfd[0].revents & POLLIN
。如果成功,您还应检查pfd[1].revents & POLLOUT
并将数据写入pfd[1].fd
。