почему родительский pid возвращает значение, отличное от getpid ()? - PullRequest
0 голосов
/ 25 ноября 2018

Согласно справочной странице

getpid () возвращает идентификатор процесса (PID) вызывающего процесса.

  1. В следующем коде почемуparent pid возвращает значение, отличное от getpid()?
  2. Разве основной процесс не совпадает с родительским процессом?
  3. И почему я получаю разные выходы при работе в другой системе?

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

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

    printf("getpid = %d \n", (int)getpid());

    pid_t pid = fork();
    printf("fork returned %d \n", (int)pid);

    switch (pid)
    {
    case -1:
        perror("fork failed");
        break;

    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

    default:
        printf("I am a parent with pid = %d\n", (int)pid);

        break;

    }
    return 0;
}

вывод при запуске:

getpid = 8208 
fork returned 8209 
I am a parent with pid = 8209
fork returned 0 
I am a child  with pid = 0

выводпри запуске на другом компьютере:

getpid = 2522 
fork returned 2523 
I am a parent with pid = 2522
fork returned 0 
I am a child  with pid = 2523

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Да, родительский процесс и основной процесс - это одно и то же.

Этот фрагмент вашего кода должен дать вам подсказку о решении:

switch (pid) {
    /* ... */
    case 0:
        printf("I am a child  with pid = %d\n", (int)pid);
        break;

Это фактически говорит "еслиpid равно нулю, тогда дочерний pid всегда равен нулю ".Это, очевидно, не может быть правдой, так что ваша интерпретация возвращаемого значения fork() является неверной.

Страница man гласит:

После успешного завершения fork ()возвращает значение 0 для дочернего процесса и возвращает идентификатор процесса дочернего процесса в родительский процесс.

Таким образом, переменная pid в родительском процессе являетсяpid child , NOT pid родителя.

В дочернем процессе вам нужно будет позвонить getpid() после fork() чтобы получить собственный пид ребенка.

0 голосов
/ 25 ноября 2018

fork дублирует процесс, и после разветвления они работают параллельно.Чтобы сообщить программе, является ли она дочерним или родительским, она возвращает 0 для дочернего, а PID дочернего процесса возвращается в родительском.

Поэтому после разветвления вы должны вызвать getpid() дляи родитель и ребенок, в вашем коде это будет:

    pid_t thispid= getpid(); 
    switch (pid)
    {
    case -1:
        perror("fork failed");
        break;

    case 0:
        printf("I am a child  with pid = %d\n", (int)thispid);
        break;

    default:
        printf("I am a parent with pid = %d\n", (int)thispid);
        break;

    }
...