Кроме проблемы неинициализированной buf
, идентифицированной @G. Sliepen, pipe()
необходимо вызывать перед fork()
, поскольку дескрипторы файлов остаются открытыми при разветвлении дочерних процессов. Так же работает конвейер.
Вы можете попробовать изменить фрагмент кода, чтобы поставить pipe()
перед fork()
.
...
if (pipe(fd) == -1)
{
perror(" pipe ");
exit(1);
}
pid = fork();
if (pid < 0)
{
perror("fork");
exit(1);
}
...
Пожалуйста, прочтите страницу руководства по pipe (2) , в котором представлен пример.
SO имеет этот пост fork () и pipe () в c также объяснили это.
Обновление для завершающего процесса (ов)
Этот дочерний процесс не знает о существовании своих братьев и сестер, но его родительский процесс имеет. Если это явно не требуется, вы можете позволить родителю сделать это, то есть «завершить» все дочерние процессы.
Кстати, вместо того, чтобы отправлять сигнал SIGUSR1, лучше отправлять сигнал SIGTERM. Хотя SIGUSSR1 может привести к завершению целевого процесса по умолчанию (см. signal (7) ).
до "fini sh", то есть уничтожить (или завершить) все дочерние процессы а также родительский процесс, вы можете просто убить родительский процесс. Все его потомки также были убиты. Или вы можете отправить сигнал той же группе процессов. См. kill (2) .