【发布时间】:2012-11-01 08:34:08
【问题描述】:
我正在编写一个简单的 shell,我必须使用 execv 将一个子进程分叉为一个外部程序。我必须将信号 TSTP(Cntl+Z) 发送到信号处理程序,然后终止当前正在运行的子进程。我的问题是我找不到将子 pid 传递给信号处理程序的方法。如果我在处理程序中执行 getpid(),它只会返回父 pid。我还尝试在子进程中将子 pid 设置为 getpid() ,并将该变量作为全局变量,但这也不起作用。这是我到目前为止的一些代码。
void handler(int);
//in main
if (!built_in_cmd(myArgc,myArgs)) {
pid_t pid;
char *x = myArgs[0];
if((pid=fork())<0)
printf("Parent: fork() process failed");
else {
if (pid == 0) {
y=getpid();
printf("Parent: My child has been spawned. %d %d\n",y,getppid());
execv(x, myArgs);
exit(0);
}
else {
signal(SIGTSTP,handler);
wait(0);
printf("Parent: My child has terminated.\n");
}
}
}
return;
//outside main
void handler(int signo){
kill(idk,SIGKILL);
}
【问题讨论】:
-
fork()返回子 PID。将它放在一个全局变量中并在信号处理程序中使用它。 -
顺便说一句,您的“父母:我的孩子已经出生”这行是孩子打印的,而不是它声称的父母。