收获僵尸? [C]

时间:2016-04-12 02:40:35

标签: c

我有几个僵尸进程在后台运行(已经不存在),我不太确定如何杀死它们。我正在制作迷你外壳,所以它基本上就像终端,但我自己的版本。

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include "main.h"

int main() {

    /* Declared variables */
    char buff[100];
    char* args[20];
    int arguments = 20;

    /* Boolean value */
    int done = 0;

    while(done != 1) {
        /* Print directory */
        printf("%s>", getcwd(0,0));
        /* Gets input */
        fgets(buff, 100, stdin);

        /* Checks to see if anything was entered */
        if (buff[0] == '\n') {
            printf("Error: Enter a command! (Example: ls -l)\n");
        } else {
            parseArgs(buff, args, 20, &arguments);

            if (*args[0] == '\n') {
                printf("Error: Enter a command! (Example: ls -l)\n");
            } else if (strcmp(args[0], "exit") == 0) {
                done = 1;
            } else if (strcmp(args[0], "cd") == 0) {
                /* Changes the directory */
                int dir = chdir(args[1]);
                if (dir != 0) {
                    printf("That directory isn't valid!\n");
                }
            } else {

                int background = 0;
                int count = 0;

                /* Create a new process */
                int process = fork();
                if (process == -1) {
                    printf("Error: Unable to create a process!");
                } else if (process == 0) {

                    /* Run user input */
                    int res = execvp(args[0], args);
                    if (res == -1) {
                        printf("\nError: Enter a command! (Example: ls -l)\n");
                        done = 1;
                    }

                    int reapingInfo;
                    waitpid(process, &reapingInfo, 0);
                }
            }
        }
    }
return (0);
}

以下是我运行ls -l几次并运行命令时输出的内容:ps

20978 pts /6        00:00:00 bash
21049 pts /6        00:00:00 main
21050 pts /6        00:00:00 ls <defunct>
21051 pts /6        00:00:00 ls <defunct>
21062 pts /6        00:00:00 ps

有关如何获得这些defunct进程的任何线索?

2 个答案:

答案 0 :(得分:2)

fork()之后的逻辑看起来并不合适。您有else if (process == 0),并且在该分支(在子进程中)中,您执行了一个新程序,之后尝试调用waitpid()。如果执行成功,execvp永远不会返回,因此大多数情况下waitpid永远不会被调用。

我认为你错过了某个elsewaitpid应该在父级中完成(fork()返回严格正值的过程)。然后waitpid将收获僵尸;这是它的工作。

(顺便说一句,如果execvp失败,你可能想要调用_exit()。让孩子继续运行完成可能是不对的。例如,stdio缓冲区中的任何数据都可能是写了两次。)

答案 1 :(得分:0)

在这里,您可以看到代码中应该使用的fork / exec / waitpid用法示例:

/* Create a new process */
int process = fork();
if (process == -1) {
    printf("Error: Unable to create a process!");
} else if (process == 0) {
    /* Run user input */
    int res = execvp(args[0], args);
    /* execvp only returns if it fails, not need to check if res == -1 */
    printf("\nError: Enter a command! (Example: ls -l)\n");
    exit(1);   /* kill this process, if exec fails! */
} else {
    int reapingInfo;
    waitpid(process, &reapingInfo, 0);
}