C / UNIX中两个子节点和父节点之间的顺序管道

时间:2016-02-20 21:30:45

标签: c linux unix pipe parent-child

我试图在操作系统书中解决关于进程间通信和管道的一个例子,但我遇到了一些困难。它要求我在父母那里找到时间,然后用1号孩子打印出来。没有2应该打印在1号儿童中找到的时间信息。在一些睡觉的父母应该打印在2号儿童中找到的时间信息。所以我认为我应该创建3个管道,因为我需要传递时间信息3我试图在孩子一和孩子二之间设计其中一个,但我不确定我是否做得正确。另一个问题是我不知道如何打印时间。当我尝试用printf%d打印时它给了我0.任何人都可以帮助我将时间从父母传给孩子1并打印出来以便我可以测试我的程序吗?这是我的代码。

#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include<signal.h>



int main(int argc, char** argv)
{
    struct timeval t1;
    struct timeval t2;
    struct timeval t3;
    int firstchild,secondchild;
    firstchild=fork();
        int mypipe[2];
    int mypipe2[2];
    int mypipe3[2];

        if(pipe(mypipe) == -1) {
          perror("Pipe failed");
          exit(1);
        }

        if(firstchild == 0)            //first child
        {

       close(STDOUT_FILENO);  //closing stdout
            dup(mypipe[1]);         //pipewrite is replaced.
        sleep(3);               
            close(mypipe[0]);       //pipe read is closed.
            close(mypipe[1]);      //pipe write is closed   

        }else{
    secondchild=fork();        //Creating second child

        if(secondchild == 0)            //2nd child
        {
            close(STDIN_FILENO);   //closing stdin
            dup(mypipe[0]);         //pipe read
        sleep(6);
            close(mypipe[1]);       //pipe write    is closed.
            close(mypipe[0]);      //pipe read is closed.   

        }else{            //Parent

    gettimeofday(&t1,NULL);
    printf("\n Time is %d ",gettimeofday(&t1,NULL));
    sleep(9);
    printf("\n Parent:sent a kill signal to child one with id %d ",secondchild-1);
    printf("\n Parent:sent a kill signal to child two with id %d ",secondchild);
    kill(secondchild-1,SIGKILL);    
    kill(secondchild,SIGKILL);
    exit(1);}}
        close(mypipe[0]);
        close(mypipe[1]);
        return 0;
    }

让问题更加明确:我认为dup工作正常。我需要的是父母和第一个孩子之间的工作管道以及用第一个孩子打印时间(用父母计算)的方法,以便我可以测试它们的工作并继续编码。只要它工作,我就可以使用不同风格的管道。使用dup是我在书中看到的东西,这就是我使用的东西

1 个答案:

答案 0 :(得分:0)

  

我应该创建3个管道,因为我需要传递时间信息3   我试图在孩子一和孩子二之间设计其中一个   但我不确定我是否做得正确。

    firstchild=fork();
        int mypipe[2];
    …
        if(pipe(mypipe) == -1) …

你并不完全。您必须在fork()之前创建管道,否则子项无法访问(父项管道的读取端)。

  

将时间从父级传递给子级号1

父:

    gettimeofday(&t1, NULL);
    write(mypipe[1], &t1, sizeof t1);

第一个孩子:

        read(mypipe[0], &t1, sizeof t1);
  

我不知道如何打印时间。当我尝试用printf打印时   %d它给了我0。

    printf("\n Time is %d ",gettimeofday(&t1,NULL));

你没有打印时间,但是gettimeofday()函数返回的是什么,正确:

        printf(" Time is %ld\n", (long)t1.tv_sec);