我正在学习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;
}
答案 0 :(得分:0)
您正在发生这些事情。
请注意第3点,父级也运行以下代码行:pipe(child1pip);
创建一个新管道-child1进程也是如此-这两个进程都创建自己的管道,因为这发生在fork()之后。
您可能只需要child1来运行pipe(child1pip);
,因此请更改此代码:
int child1pip[2];
pipe(child1pip);
if(child1pid==0)
{
此代码:
if(child1pid==0)
{
int child1pip[2];
pipe(child1pip