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

signal问题

    来源: 互联网  发布时间:2016-04-19

    本文导语:  One specific example is how an interactive shell treats the interrupt and quit signals for a background process. With a shell that doesn't support job control, when we execute a process in the background, as in     cc main.c & the shell au...

One specific example is how an interactive shell treats the interrupt and quit signals for a background process. With a shell that doesn't support job control, when we execute a process in the background, as in

    cc main.c &


the shell automatically sets the disposition of the interrupt and quit signals in the background process to be ignored. This is so that if we type the interrupt character, it doesn't affect the background process. If this weren't done and we typed the interrupt character, it would terminate not only the foreground process, but also all the background processes.

Many interactive programs that catch these two signals have code that looks like

         void sig_int(int), sig_quit(int);

         if (signal(SIGINT, SIG_IGN) != SIG_IGN)
             signal(SIGINT, sig_int);
         if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
             signal(SIGQUIT, sig_quit);
Doing this, the process catches the signal only if the signal is not currently being ignored.

These two calls to signal also show a limitation of the signal function: we are not able to determine the current disposition of a signal without changing the disposition. We'll see later in this chapter how the sigaction function allows us to determine a signal's disposition without changing it.

这段程序问题是,对于shell设置了后台程序忽略中断,退出信号,那么处理方法没问题
要是shell没有设置设置忽略中断退出信号,if(signal(SIGINT,SIG_INT) != SIG_IGN)会忽略SIGINT,后面的signal(SIGINT, sig_int)又捕捉SIGINT信号,这会发生什么事呢?相当于对SIGINT处理了两次阿,而第一次就已经ignore了,

测试代码
#include 
#include 
#include 
static void deposition(int );

int main()
{
    if(signal(SIGUSR1, SIG_IGN) != SIG_IGN)//默认为终止,if肯定成立
    {   
        signal(SIGUSR1, deposition);
    }   
    for(;;)
        pause();
}

static void deposition(int stat)
{
    printf("received user signaln");
}


[ob@localhost mycode]$ ./main &
[1] 3974
[ob@localhost mycode]$ kill -USR1 3974
received user signal

是不是这样的?signal仅仅是设置处理方法,对于该nu信号究竟怎么处理,还是要看最后的signal(nu, func)?

|
是不是这样的?signal仅仅是设置处理方法,对于该nu信号究竟怎么处理,还是要看最后的signal(nu, func)? 

正确,signal仅仅是注册了一个信号的处理函数,即当信号到达是要调用的函数.

    
 
 

您可能感兴趣的文章:

  • signal函数的定义问题?搞不懂.
  • signal函数使用出问题?
  • signal handler 问题
  • signal的处理函数问题
  • 关于signal函数的问题
  • 关于signal函数的问题,大家帮我看看
  • PPP问题fatal signal 11
  • signal函数的问题
  • signal传参问题
  • C/C++语言问题:(void) signal(SIGPIPE, pstat); 是什么意思?
  • alarm() 和 signal()的问题
  • g_signal_connect的问题
  • 关于linux下的signal函数的问题
  • signal处理函数中的文件操作问题
  • 留下这样一条信息:user signal 1 ,有高手知道这一般是什么出问题吗?
  • signal handler 问题 iis7站长之家
  • linux 2.4.0中do_signal参数传递问题,请大牛来解答
  • unix 中有关 signal 的问题
  • 请教个问题:Process #4764 received signal 11, suspending 是什么意思?
  • linux c 编程,signal函数的一个问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












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


  • 站内导航:


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

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

    浙ICP备11055608号-3