为什么子流程管道在父流程中显示不同的管道详细信息

时间:2019-01-14 12:35:42

标签: c linux

我正在学习c程序的分支和管道。我创建了一个如下所示的叉子。

parent => child1 => child2

在父级中,我们正在创建管道。文件描述符存储在parentpip中。

在Child1中,我也在创建管道。文件描述符存储在child1pip中。

现在,当我在/ proc // fd中检查进程ID fd时。下面的东西正在显示。

如果我这样做 ls -l / proc / 15585 / fd ..这是给父母的

lrwx------ 1 vipin vipin 64 Jan 14 17:33 0 -> /dev/pts/1
lrwx------ 1 vipin vipin 64 Jan 14 17:33 1 -> /dev/pts/1 
lrwx------ 1 vipin vipin 64 Jan 14 17:33 2 -> /dev/pts/1 
lr-x------ 1 vipin vipin 64 Jan 14 17:33 3 -> 'pipe:[354240]' 
l-wx------ 1 vipin vipin 64 Jan 14 17:33 4 -> 'pipe:[354240]' 
lr-x------ 1 vipin vipin 64 Jan 14 17:33 5 -> 'pipe:[354241]' 
l-wx------ 1 vipin vipin 64 Jan 14 17:33 6 -> 'pipe:[354241]' 

如果我这样做 ls -l / proc / 15586 / fd ..这是给child1

 lrwx------ 1 vipin vipin 64 Jan 14 17:33 0 -> /dev/pts/1
lrwx------ 1 vipin vipin 64 Jan 14 17:33 1 -> /dev/pts/1
 lrwx------ 1 vipin vipin 64 Jan 14 17:33 2 -> /dev/pts/1
lr-x------ 1 vipin vipin 64 Jan 14 17:33 3 -> 'pipe:[354240]'
l-wx------ 1 vipin vipin 64 Jan 14 17:33 4 -> 'pipe:[354240]'
lr-x------ 1 vipin vipin 64 Jan 14 17:33 5 -> 'pipe:[357693]'
l-wx------ 1 vipin vipin 64 Jan 14 17:33 6 -> 'pipe:[357693]'

如果我这样做 ls -l / proc / 15587 / fd ..这是给child2

lrwx------ 1 vipin vipin 64 Jan 14 17:33 0 -> /dev/pts/1
lrwx------ 1 vipin vipin 64 Jan 14 17:33 1 -> /dev/pts/1
lrwx------ 1 vipin vipin 64 Jan 14 17:33 2 -> /dev/pts/1
lr-x------ 1 vipin vipin 64 Jan 14 17:33 3 -> 'pipe:[354240]'
l-wx------ 1 vipin vipin 64 Jan 14 17:33 4 -> 'pipe:[354240]'
lr-x------ 1 vipin vipin 64 Jan 14 17:33 5 -> 'pipe:[357693]'
l-wx------ 1 vipin vipin 64 Jan 14 17:33 6 -> 'pipe:[357693]'

这里的文件描述符3和4属于parentpip。因此,在所有流程 pipe:[354240] pipe:[354240]

当我们看到文件描述符5和6时child2和child1持有相同的child1pip。 管道:[357693] 管道:[357693]

但是我也可以在父级中看到5和6,为什么在父级中也可以看到。点是管道:[354241] 管道:[354241]

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


int main(int argc,char * argv[])
{

    int parentpip[2];

    pipe(parentpip);

    int child1pid =fork();

    int child1pip[2];
    pipe(child1pip);

    if(child1pid==0)
    {
        printf("This child1");
        int child2pid2=fork();
        if(child2pid2==0)
        {
          printf("This child2");
        }
        sleep(20*60);
    }
    else
    {
        printf("This parent");
        sleep(20*60) ;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您正在发生这些事情。

  1. 父级创建存储在父级中的管道354240
  2. child1是从父级派生的,继承管道354240
  3. 父级创建存储在child1pip中的管道354241
  4. child1创建存储在child1pip中的管道357693
  5. child2是从child1派生的,继承了管道354240和357693

请注意第3点,父级也运行以下代码行:pipe(child1pip); 创建一个新管道-child1进程也是如此-这两个进程都创建自己的管道,因为这发生在fork()之后。

您可能只需要child1来运行pipe(child1pip);,因此请更改此代码:

int child1pip[2];
pipe(child1pip);

if(child1pid==0)
{

此代码:

if(child1pid==0)
{
     int child1pip[2];
     pipe(child1pip
相关问题