【发布时间】:2014-11-11 17:22:44
【问题描述】:
我正在尝试制作一个简单的 shell,并正在添加功能以使用 & 在后台运行进程。 在我的主要方法中,我基本上有:
int main() {
if (signal(SIGCHLD, handle) == SIG_ERR)
perror("Cannot catch SIGCHLD");
pid_t child = fork();
if (child == 0)
execvp(command, arguments);
else {
if (background == 1) {
printf("1");
backgroundList(command, child);
printf("2"); }
else
waitpid(child, NULL, 0);
}
}
对于我的处理程序,我有:
void handle(int s) {
printf("a");
if (signal(SIGCHLD, handle) == SIG_ERR)
perror("Cannot catch SIGCHLD");
pid_t pid;
printf("b");
while((pid = waitpid(0, NULL, WNOHANG)) > 0) {
printf("c");
rmBackgroundList(pid);
printf("d");
}
}
我可以让它在前台运行一个进程就好了。运行“ls”会将内容打印到屏幕上,然后打印“a”和“b”,因为它进入 SIGCHLD 处理程序,但它不会进入“c”,因为它已经被等待。
但是,在后台运行某些东西(“ls&”)会打印“1”和“2”,让父级返回提示符,然后子级将内容打印到屏幕上,然后分段错误。它不会打印我在处理程序中的任何字母。
我不明白为什么 SIGCHLD 对已经等待的子进程有好处,但会导致分段错误,甚至从未进入未等待进程的处理程序。
【问题讨论】:
-
你真的应该让你的代码成为一个完全可编译的版本。很明显这是行不通的,因为它缺少很多东西,比如变量和函数定义。