全部博文(240)
分类: LINUX
2011-11-08 22:20:26
作者:冯利美,讲师。
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它。从这点,可以看出,linux并不是一个实时的操作系统。下面例子说明了,linux 操作系统并不能保证立即处理信号。
#include
#include
#include
#include
int main()
{
pid_t pid;
if ((pid = vfork()) == -1)
{
perror("fork");
return -1;
}
if (pid == 0) //child process
{
i++;
printf("In child: i=%d &i=%p %d %d\n", i, &i, getpid(), getppid());
getchar();
}
else //parent process
{
i++;
printf("In parent: i=%d &i=%p %d %d\n", i, &i, pid, getpid());
while (1);
}
exit(0);
}
程序运行的情况见下图:
当程序运行后,查看两个进程的状态。子进程,处于可中断等待态(S+)。父进程处于,不可中断等待态(D+)。因为vfork,要求必须子进程结束后,父进程才可以运行。此时,子进程还没有结束,getchar(),所以父进程处于D状态。
如果此时,给父进程发送SIGKILL(编号9)信号。父进程不会被结束。但是,只要子进程一结束,父进程得到运行机会,立即收到SIGKILL信号,被杀死。