当前位置: 技术问答>linux和unix
linux fork 和signal 的问题
来源: 互联网 发布时间:2017-03-14
本文导语: pid_t pid = fork(); if(pid == -1) { perror("error!n"); exit(1); } else if(pid == 0) { sleep(3); kill(getppid(),SIGALRM); exit(0); } printf("wait for 3s"); signal(SIGALRM,alrm);//alrm 是处理函数 pause(); printf("receive alarm"); ...
pid_t pid = fork();
if(pid == -1)
{
perror("error!n");
exit(1);
}
else if(pid == 0)
{
sleep(3);
kill(getppid(),SIGALRM);
exit(0);
}
printf("wait for 3s");
signal(SIGALRM,alrm);//alrm 是处理函数
pause();
printf("receive alarm");
1.创建进程后进程执行顺序是什么?能列举语句执行顺序吗?
2.子程序执行kill(getppid(),SIGALRM) 后是结束父进程,就是这个程序了吗?
谢谢。
if(pid == -1)
{
perror("error!n");
exit(1);
}
else if(pid == 0)
{
sleep(3);
kill(getppid(),SIGALRM);
exit(0);
}
printf("wait for 3s");
signal(SIGALRM,alrm);//alrm 是处理函数
pause();
printf("receive alarm");
1.创建进程后进程执行顺序是什么?能列举语句执行顺序吗?
2.子程序执行kill(getppid(),SIGALRM) 后是结束父进程,就是这个程序了吗?
谢谢。
|
1、没有明确的先后顺序。如果你依赖于这个顺序,必须自己采取某种同步机制
2、这个kill调用是给父进程发送SIGALRM信号
2、这个kill调用是给父进程发送SIGALRM信号
|
进程创建后交给操作系统调度了,只能自己用某些办法控制的。
|
父进程在fork之前就把signal/sigaction注册上SIGALRM, 或者在fork之前sigprocmask阻塞SIGALRM, 并且把pause语句换成sigsuspend来解除ALRM阻塞挂起等待SIGALRM信号唤醒,最好在sigsuspend挂起时阻塞除了ALRM外的所有信号,免得被其他信号唤醒,或者ALRM的信号处理函数设置个全局变量用于检查。
|
1.父进程和子进程是异步的,先后顺序不确定。
2.
2.