对子进程C的操作



我想创建一个程序:

  1. 创建子进程
  2. 列出所有子进程
  3. 读取PID以终止其中一个子进程
  4. 再次列出所有子进程

我的代码:

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <string.h>
int main(void) {
    int c = 0;
    printf("How many: ");
    scanf("%d", & c);
    int i = 0;
    for (i = 1; i <= c; i++) {
        pid_t pid = fork();
        if (pid == 0) {
            exit(0);
        }
    }
    ListOfChildren();
    int t;
    printf("Kill child: ");
    scanf("%d", & t);
    char test[50];
    snprintf(test, sizeof(test), "kill -15 %d", t);
    system(test);
    ListOfChildren();
    return 1;
}
int ListOfChildren() {
    char str[50] = "ps -o pid --ppid ";
    char ppid[7];
    sprintf(ppid, "%d", getpid());
    strcat(str, ppid);
    system(str);
    return 1;
}

它创建了一些进程,但最后一个进程不存在?我不能杀人甚至没有一个。。。为什么当我想要3的时候,它会显示4的过程?

因为当你分叉时,你的孩子会立即退出,当你试图杀死他们时,他们很可能已经死了(很可能,不是强制性的,这取决于调度程序)。列出的内容相同:您看到的进程是一些尚未退出的剩余进程,以及由第一个进程创建的进程"ps"本身。

回答您的第一个问题

最后一个进程不存在,因为它是由程序中的系统命令派生的子进程,一旦命令返回,该进程将不再有效,因此您无法看到该进程。有关更多详细信息,请查看系统命令的手册页

http://linux.die.net/man/3/system

对于第二个问题,实际上您的子进程已经完成执行,它们已经成为无效进程。你可以通过执行在程序中检查它们

ps -ef | grep defunct

然后输入"杀死孩子:"中的某个选项。然后,您将看到您在程序中派生的子进程已失效。

它们已经失效的原因是

父进程必须明确注意使用wait()系统调用导致孩子死亡。

http://en.linuxreviews.org/Defunct_process

你不能用正常杀死他们

kill -9 pid

这就是为什么"杀死"对你不起作用的原因。

相关内容

  • 没有找到相关文章

最新更新