Почему сигнал SIGCHLD не игнорировался при использовании функций wait()?

sed +numfmtраствор:

lshw -class disk -class storage \
| sed -n '/size:/ s/.*(\([0-9]*.*[KMGT]\)B)/\1/p' \
| numfmt --from si | paste -sd+ - | bc | numfmt --to si --suffix B

paste -sd+ - | bcтакже можно заменить наawk '{ sum+=$1 }END{ print sum }'

0
29.01.2020, 13:54
1 ответ

Хотя мы можем прочитать ваши 2 образца, ваш вопрос вряд ли имеет какой-либо смысл.

В соответствии со спецификацией POSIX/Single Unix версии 4, издание 2018 г., когда процесс явно не указал системе, что он хочет игнорировать статусы своих дочерних процессов:

  • Должна генерироваться информация о состоянии (, код состояния выхода и т. д. ).

  • [Выходящий] процесс должен быть преобразован в зомби-процесс....

  • Время жизни процесса должно закончиться, как только его родитель получит информацию о состоянии процесса...

  • Если один или несколько потоков в родительском процессе вызывающего процесса заблокированы в вызове wait (), waitid ()или waitpid ()в ожидании завершения процесса, один (или, если любой из них вызывает waitid ()с WNOWAIT, возможно, больше )из этих потоков должны получить информацию о статусе [выходящего] процесса... и разблокироваться.

  • SIGCHLD должен быть отправлен родительскому процессу.

Обратите внимание на последний пункт -SIGCHLDвсегда генерируется (, если только родитель не указал его игнорировать )!

Обновление

Я протестировал оба фрагмента вашей программы, завернутые в заглушку, которую я считаю правдоподобной. Оба успешно запускаются. Вот 2 полных исходных кода программы и вывод терминала:

Полный пример 1.1:

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

int main()
{
    pid_t pid;

    pid = fork();

    if( pid == 0 ) {
        printf("child\n");
        printf("%d\n", pid);
    }
    else {
        printf("Parent\n");
        printf("%d\n", pid);
        wait(NULL);
        sleep(10);
    }
}

Полный пример 1.2:

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

int main()
{
    pid_t pid;

    pid = fork();

    if( pid == 0 ) {
        printf("child\n");
        printf("%d\n", pid);
    }
    else {
        printf("Parent\n");
        printf("%d\n", pid);
        sleep(10);
    }
}
//64-bit Mac Mini./
$ make s1 s2 ;./s1 ;./s2
make: `s1' is up to date.
make: `s2' is up to date.
Parent
46431
child
0
Parent
46449
child
0

//64-bit Mac Mini./
$
1
28.04.2021, 23:25

Теги

Похожие вопросы