gpt4 book ai didi

c - 子进程如何杀死其他子进程然后终止?

转载 作者:行者123 更新时间:2023-11-30 14:32:43 26 4
gpt4 key购买 nike

这是代码,其中父进程在管道中写入字符串输入,子进程从管道中读取该字符串。如果子进程从管道中读取单词“end”,那么我想终止所有进程,然后终止自身,如果读取单词“finish”,我想向父亲发出一个信号以杀死所有进程,然后退出。我运行代码,发现段错误。为什么是错误的呢?

#define _POSIX_SOURCE
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
void measure_time(int sig)
{
printf("child [%d] received signal %d\n", getpid(), sig);
}
int main(int argc, char *argv[])
{
int n_task = 4;
pid_t pid;
pid_t pid_array[n_task];
int fd[2];
for (int i = 0; i < n_task; i++)
{
pid = fork();
if (pipe(fd) == -1)
{
perror(" pipe ");
exit(1);
}
if (pid < 0)
{
perror("fork");
exit(1);
}
if (pid == 0) //child
{
char *buf;
close(fd[1]);
read(fd[0], buf, 10);
printf("I read: %s", buf);
if (strcmp(buf, "end") == 0)
{
for (int i = 0; i < n_task; i++)
kill(pid_array[i], SIGUSR1);
}else if(strcmp(buf,"finish") == 0){
/*Here i want father to kill all children and then exit.*/
}
exit(0);
}
close(fd[0]);
char *buf;
printf("Give the input string: \n");
scanf("%s", buf);
write(fd[1], buf, strlen(buf));
close(fd[1]);
pid_array[i] = pid;
}
sleep(1);
for (int i = 0; i < n_task; i++)
wait(NULL);
return (0);
}

最佳答案

除了@G 识别出的未初始化buf 问题。 Sliepen,需要在 fork() 之前调用 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() and pipes() in c对此也进行了解释。

终止进程的更新

该子进程不知道其兄弟进程的存在,但其父进程知道。如果没有明确要求,您可以让父进程这样做,即“结束”所有子进程。

顺便说一句,与其发送信号 SIGUSR1,不如发送 SIGTERM 信号。虽然 SIGUSSR1 可以导致目标进程默认终止(请参阅 signal(7) )。

要“完成”,即杀死(或终止)所有子进程以及父进程,您可以简单地杀死父进程。其子孙也全部被杀。或者,您可以向同一进程组发送信号。请参阅kill(2) .

关于c - 子进程如何杀死其他子进程然后终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59694870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com