Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708889
  • 博文数量: 240
  • 博客积分: 3616
  • 博客等级: 大校
  • 技术积分: 2663
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 23:59
文章分类

全部博文(240)

文章存档

2013年(6)

2012年(80)

2011年(119)

2010年(35)

分类: 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信号,被杀死。

转自:http://blog.chinaunix.net/cp.php?ac=blog

阅读(433) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~