子进程的操作C.

时间:2015-12-12 11:26:38

标签: c ubuntu process child-process

我想创建一个程序:

  1. 创建子流程
  2. 列出所有子流程
  3. 读取PID以杀死其中一个子进程
  4. 再次列出所有子流程。
  5. 我的代码:

    #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个过程?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

回答你的第一个问题

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

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

对于第二个问题,确实您的子进程已经完成执行,并且它们已经变为已失效的进程。您可以通过执行

在程序中查看它们
ps -ef | grep defunct

在你输入一些选项之前&#34;杀死孩子:&#34;。然后,您将看到在程序中分叉的子进程已不存在。

他们已经解散的原因是

  

父进程必须明确注意到   孩子们通过使用wait()系统调用来消亡。

http://en.linuxreviews.org/Defunct_process

你不能通过

正常杀死它们
kill -9 pid

这就是&#34; kill&#34;不适合你。