Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何终止多个子进程_C_Kill Process - Fatal编程技术网

C 如何终止多个子进程

C 如何终止多个子进程,c,kill-process,C,Kill Process,在模拟读写器问题的C程序中,我使用fork()创建了多个子进程,每个子进程调用execlp(),并在xterm窗口中运行另一个程序(读写器) 当我结束main()时,那些在xterm中运行的子级仍然是活动的。我如何终止他们呢 下面是代码示例- main() { while(1) { scanf(choice); switch(choice) { case 1: reader() break;

在模拟读写器问题的C程序中,我使用
fork()
创建了多个子进程,每个子进程调用
execlp()
,并在xterm窗口中运行另一个程序(读写器)

当我结束
main()
时,那些在xterm中运行的子级仍然是活动的。我如何终止他们呢

下面是代码示例-

main() {
    while(1) {
    scanf(choice);
    switch(choice) {
        case 1: 
            reader()
            break;
        case 2: 
            writer();
            break;
        default:
            kill(getpgid(getpid()), SIGTERM); // killing the group id
            return 0;
        }
    }

reader() {
    /*
    some semaphore manipulation
    */
    execlp("xterm", "xterm", "-e", "./read", NULL);
    /*
    some semaphore manipulation
    */
    return 0;
    }

writer() {
    /*
    some semaphore manipulation
    */
    execlp("xterm", "xterm", "-e", "./write", NULL);
    /*
    some semaphore manipulation
    */
    return 0;
    }

分叉后父级和子级的组id应该相同,因此发送
kill(pid,SIGTERM)
应该照顾他们(其中pid是组Id)


正如caf在下面的评论中指出的,
kill(0,SIGTERM)
将向当前进程的进程组发送信号

如何确定组id?使用getpgid(),此处提供了更多详细信息()希望帮助SI已经完成了“kill(getpgid(getpid()),SIGTERM)”,但xterm窗口仍然打开,我仍然可以继续处理它们。您的execlp()调用是什么样子的?(一个更简单的解决方案是在父项中保留一个创建时的子ID列表,然后循环并杀死每个ID。此外,您可能希望在这里的第一个示例()中看到它如何应用于您的案例