Почему дочерний процессный канал отображается в родительском процессе с различными деталями канала - PullRequest
0 голосов
/ 14 января 2019

Я учусь c программой fork and pipe. Я создаю вилку, показанную ниже.

parent => child1 => child2

В parent мы создаем канал. И дескриптор файла хранится в parentpip.

В Child1 я также создаю трубу. И дескриптор файла хранится в child1pip.

Теперь, когда я проверяю идентификатор процесса fd в / proc // 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. Так же труба среди всех процессов труба: [354240] и труба: [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 голосов
/ 14 января 2019

У вас такие вещи происходят.

  1. parent создает канал 354240, сохраненный в parentpip
  2. child1 разветвляется от родителя, наследуя канал 354240
  3. parent создает канал 354241, сохраненный в child1pip
  4. child1 создает канал 357693, сохраненный в child1pip
  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...