当前位置:  技术问答>linux和unix

关于signal()函数

    来源: 互联网  发布时间:2016-06-09

    本文导语:  请求高手: #include  #include  #include  void waiting( ),stop( ); int wait_mark; main( ) { int p1,p2,stdout; while((p1=fork( ))= =-1);       /*创建子进程p1*/ if (p1>0) { while((p2=fork( ))= =-1);     /*创建子进程p2*/ if(p2>0) { wait_mark=1; si...

请求高手:
#include 
#include 
#include 

void waiting( ),stop( );
int wait_mark;
main( )
{
int p1,p2,stdout;
while((p1=fork( ))= =-1);       /*创建子进程p1*/
if (p1>0)
{
while((p2=fork( ))= =-1);     /*创建子进程p2*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop);   /*接收到^c信号,转stop*/
waiting( );
kill(p1,SIGINT);        /*向p1发软中断信号SIGINT*/
kill(p2,SIGINT);        /*向p2发软中断信号SIGINT*/
wait(0);           /*同步*/
wait(0);
printf("Parent process is killed!n");
exit(0);
}
           else
             {
                    wait_mark=1;
signal(SIGINT,stop);   /*接收到软中断信号17,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(SIGINT,stop);        /*接收到软中断信号16,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!n");
lockf(stdout,0,0);
exit(0);
}
}

void waiting( )
{
 while(wait_mark!=0);
}

void stop( )
{
wait_mark=0;
}
在这段程序的运行结果:
当你按下ctrl_c后,程序显示:
Child process 1 is killed by parent!
Child process 2 is killed by parent!
Parent process is killed!

mait_mark显然是为了同步的
但是小弟就有个问题不懂了
我们每次都是先把mait_mark=1然后再接信号
问题:
于是小弟就想了,要是进程在运行到signal(SIGINT,stop);时,信号没到,我们势必回在waiting()函数里面等待,而这个函数不是为了接收进程消息的,所以,我们从键盘上输入的任何的信息都是没有用的,也就是他是一个死循环了。
但是显然是不对的。

猜想:
那么就只有一个解释了,那就是signal()函数有同步机制,也就是说,signal(SIGINT,stop);函数必须要等到我们从键盘上输入数据时,才继续执行。那么,我们在程序中所作的同步机制起步是很多余。
为了验证这个想法,我将同步机制去掉后,结果让我相当失望,那就是你不必输入ctrl_c的消息,程序已经将上面的信息进行显示的。这就是说,signal()函数是无同步机制的。

于是,小弟就郁闷了,那么,我们上面的问题中所提出的问题是怎么解决的?signal()函数在实现的时候,是怎么做的。我们这样写
while(wait_mark!=1) signal(SIGINT,stop);
岂不是更好么

望各位高手帮忙解答
感激不尽

|
你的猜想是不对的,,

事实上p1,p2是两个子进程,你可以在waiting函数里面加打印语句,延迟父进程发信号的时间,你会发现是在不停的打印的
当你waiting的时候,,一旦有信号进入,是触发了你定义的信号处理函数,把wait_mark给修改了,
你得清楚signal(SIGINT,stop);的时候,你并没有调用stop函数,而是把一个函数指针给了一个回调函数的接口。。
只有在子进程接受到SIGINT信号的时候,系统查询你对这个信号的处理函数,才会调用stop函数

|
我是来学习学习的,希望以后大家多多指教

    
 
 

您可能感兴趣的文章:

  • 请教signal函数的用法!
  • signal函数定义该怎么理解?
  • 请问有没头函数<pthread.h>和<signal.h>里的函数的详细功能介绍?和使用方法???
  • 关于signal函数
  • 关于系统信号处理函数signal()的疑问.
  • signal的处理函数问题
  • 关于signal函数的问题
  • signal函数的定义问题?搞不懂.
  • signal函数使用出问题?
  • signal 函数请教
  • 关于signal函数的问题,大家帮我看看
  • 关于linux下的signal函数的问题
  • 在signal指定的处理函数中如何传进去一个值?
  • 向各位求助:关于signal函数
  • REDHAT LINUX 9中如何使用signal这个函数进行中断通信?
  • 谁能给我解释一下SIGNAL这个函数呀?
  • signal处理函数中的文件操作问题
  • 请问:signal(), sigaction()函数会不会使自已所有的进程挂起啊,(这样就等接收各种信号,进行一些处理工作啊)
  • 谁给解释下这个signal函数
  • linux中信号signal函数实例遇到的疑问
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.concurrent.locks接口condition的类成员方法: signal定义及介绍
  • signal 7和signal 11
  • 关于signal信号
  • 关于signal返回值是什么?
  • pending signal
  • 关于Linux驱动中signal的使用
  • about "signal"
  • 有关signal handler,请教!
  • signal handler 问题
  • signal的疑惑
  • 关于signal ()
  • signal和sigaction区别
  • PPP问题fatal signal 11
  • C/C++语言问题:(void) signal(SIGPIPE, pstat); 是什么意思?
  • alarm() 和 signal()的问题
  • ***************unix 系统中,信号量(signal)被屏蔽了,怎么开(是在命令行超作,不是在程序中)
  • 在类中使用signal编译不通过
  • signal()基础知识,<<apue>>上的程序疑问
  • Program received signal SIGPIPE, Broken pipe. 这是什么回事?
  • 如何将自定义的信号发给signal表记的进程?
  • 急急急!gdb下Program received signal SIGABRT, Aborted.是什么错误?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3