我有几个僵尸进程在后台运行(已经不存在),我不太确定如何杀死它们。我正在制作迷你外壳,所以它基本上就像终端,但我自己的版本。
这是我的代码:
#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
进程的任何线索?
答案 0 :(得分:2)
fork()
之后的逻辑看起来并不合适。您有else if (process == 0)
,并且在该分支(在子进程中)中,您执行了一个新程序,在之后尝试调用waitpid()
。如果执行成功,execvp
永远不会返回,因此大多数情况下waitpid
永远不会被调用。
我认为你错过了某个else
。 waitpid
应该在父级中完成(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);
}