ядро Linux разветвило дочерний возврат статуса - PullRequest
2 голосов
/ 19 октября 2011

Итак, вот моя дилемма: почему, когда я fork(); является дочерним элементом процесса и он завершается, возвращаемое &status дочернего элемента смещается влево на 8 бит?

Например, скажем, у меня есть exit(4); в конце разветвленного ребенка, мой статус в wait(&status); отцовского процесса дает мне 0x400.

, поэтому вот некоторыекод, который иллюстрирует, что я имею в виду

#include <stdio.h>

main() {
  int n, status, cpid;

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

  n = fork();

  if (n != 0) {
     //  parent code
     printf ("I'm the parent with PID %d \t fork returned %d \t my parent is %d\n", getpid(), n, getppid()); 
     status = 0;
     sleep(5);      // verify status of child
     cpid = wait(&status);

     // so when i printf the hex value of status it gets shifted 
     printf("I received from my child %d this information %x\n", cpid, status);

   } else {
        // child code
        printf ("I'm the child with PID %d \t fork returned %d \t my parent is %d\n", getpid(), n, getppid());
        sleep(20);
        printf("Child complete\n");
        status=12345;

        // the line that returns the shifted value
        exit(4);
     }

     printf("Parent complete\n");
     exit(15);
}

Ответы [ 2 ]

6 голосов
/ 19 октября 2011

Прочтите документацию по wait(3).Возвращаемое значение представляет собой 32-разрядное целое число, содержащее состояние выхода (если процесс завершился нормально), а также количество битов флага.Чтобы определить, нормально ли завершился процесс, используйте макрос WIFEXITED().Если это возвращает true, то используйте макрос WEXITSTATUS(), чтобы получить фактический статус выхода:

int status;
if(wait(&status) > 0)
{
    // Did the process exit normally?
    if(WIFEXITED(status))
    {
        // This is the value you really want
        int actual_status = WEXITSTATUS(status);
        ...
    }
}
3 голосов
/ 19 октября 2011

Поскольку status содержит не только код возврата дочернего элемента, но и другую информацию.
если вы хотите знать значение выхода, вы должны использовать макрос WEXITSTATUS

из инструкции по ожиданию:

WEXITSTATUS (статус) возвращает статус выхода ребенка. Это состоит из наименее значимые 8 битов аргумента статуса , что дочерний указывается в вызове для выхода (3) или _exit (2) или в качестве аргумента для возврата в main (). Этот макрос должен быть только используется, если WIFEXITED вернул true.

это означает, что целое число status содержит другую информацию, и для извлечения этой информации вы должны использовать макросы, определенные в sys/wait.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...