我在锻炼过程中遇到了麻烦。我想分叉一个子进程并在宣布它已经分叉后挂起,并等待一个信号终止,之后父进程必须宣布它正在终止然后退出。
我可以将进程分叉并让父进程等待挂起的子进程被信号杀死,但它似乎也会杀死父进程。我试图通过其PID来杀死子进程,但没有成功。
感谢您的帮助!
代码:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
void catchInt (int signum)
{
printf("\nMy sincerest apologies, master\n");
/*kill(0, SIGINT);*/
exit(0);
}
void ignoreInt (int signum)
{
wait(NULL);
}
int main () {
pid_t pid;
/* fork process */
pid = fork();
if (pid < 0) /* error handler */
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0) /* child */
{
printf("Child reporting in\n");
signal(SIGINT, catchInt);
for ( ;; )
pause();
}
else /* parent */
{
/* parent will wait for the child to complete */
signal(SIGINT, ignoreInt);
wait(NULL);
printf("You're welcome\n");
exit(0);
}
}
答案 0 :(得分:3)
即使假设您修改代码以便编译(您还没有定义tempPID),也会出现问题:
所以,你有一个状态,两个进程都不会再做任何事了。
您可能需要父母向孩子发送信号:
kill(pid, SIGINT);
void main()
不正确 - int main()
或int main(void)
或int main(int argc, char **argv)
是main()
的已批准声明。main()
返回值(0),则更整洁。 C99标准确实允许你放弃main()
的结尾并将其视为返回零,但仅当函数被正确声明为返回int
时。wait()
和亲戚的标头为<sys/wait.h>
。而且,因为我是一个傻瓜,这里的代码可以编译,甚至可以做你想要的:
#include <stdio.h>
#include <signal.h>
#include <unistd.h> /* getpid() */
#include <stdlib.h>
#include <sys/wait.h>
void catchInt(int signum)
{
printf("Child's PID is %d\n", (int)getpid());
printf("My sincerest apologies, master\n");
exit(1);
}
int main()
{
pid_t pid = fork();
if (pid < 0) /* error handler */
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0) /* child */
{
printf("Child reporting in\n");
signal(SIGINT, catchInt);
pause();
}
else /* parent */
{
sleep(1);
kill(pid, SIGINT);
wait(NULL);
printf("You're welcome\n");
}
return(0);
}
答案 1 :(得分:0)
刚刚弄清楚我做错了什么,我应该已经意识到SIGINT被发送到每个进程,因此父进程只是被发送一个未处理的SIGINT,导致它退出。感谢所有的帮助(对于草率的编码道歉,我真的不应该等到程序完成后才能清理它),代码已在上面编辑并按预期工作。
再次感谢。