制作命名管道并使用民意调查

时间:2014-07-21 16:34:24

标签: c linux file-descriptor

我对此很困惑,我需要使用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运行程序。然后等到其中一个管道出现问题,然后吐出需要对文件数据做的事情。如果我朝着正确的方向前进,那么任何人都可以和我清楚。

1 个答案:

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