免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2120 | 回复: 0
打印 上一主题 下一主题

如何处理键盘输入的信号呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-05 08:58 |只看该作者 |倒序浏览
/*****************************************************

用fork( )创建两个子进程,再用系统调用signal( )让父进程

捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,

父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉

到信号后分别输出下列信息后终止:

Child process1 is killed by parent!

Child process2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:

Parent process is killed!

**********************************************************/



#include<stdio.h>

#include<signal.h>

#include<unistd.h>

int wait_mark;

void waiting( );
void stop( );
void tt()
{
        printf("2222");
}



void main( )

{

        int p1,p2;

        while((p1=fork())==-1);
                        signal(SIGINT,stop);

        if(p1>0)              /*主进程的处理*/

        {            

                while((p2=fork())==-1);
                       

                if(p2>0)          /*主进程的处理*/

                {        

                        wait_mark=1;

               

                        waiting( );                        /*等待接收ctrl+c信号*/                       

                        kill(p1,16);                /*向p1发出信号16*/                       

                        kill(p2,17);                /*向p2发出信号17*/

                        /*同步*/

                        wait(0);

                        wait(0);

                        printf("parents is killed \n");

                        exit(0);

                }

                else                                 /*p2进程的处理*/

                {

                        wait_mark=1;

                        signal(17,stop);
                        signal(SIGINT,tt);

                        waiting();       
                        sleep(10);                /*等待信号17*/

                        lockf(stdout,1,0);        /*用上锁的方法实现互斥*/                               

                        printf("P2 is killed by parent \n");

                        lockf(stdout,0,0);                       

                        exit(0);/*模拟P2被kill时进程的工作*/

                }

        }

        else                /*p1进程的处理*/

        {

                wait_mark=1;

                signal(16,stop);


                waiting( );                        /*等待信号16*/               

                lockf(stdout,1,0);        /*用上锁的方法实现互斥*/

                printf("P1 is killed by parent \n");

                lockf(stdout,0,0);

                /*模拟P1被kill时进程的工作*/

                exit(0);

        }

}



void        waiting( )

{

        while(wait_mark!=0);

}



void        stop( )

{

        wait_mark=0;

}



我在P2进程中加了一个signal(SIGINT,tt),我按俩次CTRL+C,会输出8个2,就是说第一次按CTRL+C时父进程收到CTRL+C信号,P2也收到CTRL+C信号,不是说信号是只能消费一次吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP