C -制作命名管道和使用poll



我对此感到困惑,我需要使用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,如果成功。

相关内容

  • 没有找到相关文章

最新更新