c - 使用管道

时间:2016-06-29 15:37:40

标签: c linux pipe ipc

刚开始学习管道(一般的IPC)。在我浏览了一些手册页,网站和一些SO问题之后,例如thisThis和其他一些问题。我知道了基本知识,我发现这种沟通只进行了一次,即父母写给孩子和孩子读它或父母和孩子只读一次,然后管子关闭。

我想要的是在没有管道关闭的情况下保持流程之间的通信,即, 比方说,我的程序有2个子进程,其中第一个子进程在while循环中运行某些东西,而第二个进程正在连续运行一个计时器。在一定的时间间隔,我的第二个过程向第一个孩子发送一些“信号”,我的第一个停止并在那一刻打印出一些内容并再次重新启动,以便下一个定时器停止(< -This I done使用了线程)

这是我作为样本尝试的程序。但我无法保持沟通的连续性。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    int     fd[2], nbytes, count = 5;
    pid_t   childpid;
    char    string[] = "Hello, world!\n";
    char    readbuffer[80];

    if((childpid = fork()) == -1)
    {
            perror("fork");
            exit(1);
    }

    if(childpid == 0)
    {
            /* Child process closes up input side of pipe */


            /* Send "string" through the output side of pipe */
            while(count--)
            {
                pipe(fd);
                close(fd[0]);
                write(fd[1], string, (strlen(string)+1));
                close(fd[1]);
            }
            exit(0);
    }
    else
    {
            /* Parent process closes up output side of pipe */
            while(count--)
            {
                pipe(fd);
                close(fd[1]);

            /* Read in a string from the pipe */
            nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
            printf("Received string: %s\n", readbuffer);
            close(fd[0]);
            close(fd[1]);
            }
    }
    int status;
    waitpid(getppid(), &status, 0);

    printf("Done!\n");

    return(0);

}

从这些示例中,我推断每次发送/读取后管道都会关闭。 我每次尝试打开新烟斗,但我还是得不到它。

任何人都可以帮助我,我错过了什么,或者我该怎么做?

2 个答案:

答案 0 :(得分:2)

现在父母和孩子都创建了自己的一对管道,而另一个管道则不知道。

管道应该在父进程 之前 创建。

此外,关闭循环中管道的读/写端,当你在循环之后关闭它们时,所有的通信都已完成。

一个小小的无关问题......

在读者中你应该循环,而read不会返回0(然后管道的写端被关闭)或-1(如果有错误)。

答案 1 :(得分:0)

如果您使用共享内存方法会很棒。在这种方法中,父进程将分配一个将在所有进程之间共享的内存区域。使用锁来保护您的资源,即共享内存。您还可以访问此answer,其中详细说明了背后的概念。还要记住,在共享内存方法中,通信可以是多对多的。但是在管道的情况下它是一对一的。 干杯, K. Infoginx.com