关于signal函数返回值 的问题?

时间:2021-07-21 00:11:29
理论上说,signal成功处理后返回信号以前的处置。
于是我写了如下一个函数:
----------------------------
#include "apue.h"
#include "error.h"
static void sig_usr1(int);
static void sig_usr2(int);

int 
main(void){
Sigfunc* func;
int i=0;
if(signal(SIGUSR1,sig_usr1)==SIG_ERR)
err_sys("can't catch S1");
if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)
err_sys("can't catch S2");
for(i=0;i<2;i++)pause();
func(5);
//func = sig_usr1;
//func(10);
}
static void sig_usr1(int signo){
printf("\n usr1\n");
}
static void sig_usr2(int signo){
        printf("\n usr2\n");
}
/*
output:
                                                                              
[root@localhost f10.1]# ./c &
[1] 3348
[root@localhost f10.1]# kill -USR1 3348
                                                                                
 usr1
[root@localhost f10.1]# kill -USR2 3348
                                                                                
 usr2
[root@localhost f10.1]#
[1]+  段错                                                                              


*/
------------------------------------------------
我预期是这样的:
func可以得到signal前一次的处置,就是sig_usr1,于是打印
usr1
但是结果不正确,出现段出错,我觉得这当中没有 什么堆栈分配的问题嘛?
请赐教

16 个解决方案

#1


代码格式有点乱,改了一下
----------------------------------
#include "apue.h" 
#include "error.h" 
static void sig_usr1(int); 
static void sig_usr2(int); 

int  
main(void){ 
   Sigfunc* func; 
   int i=0; 
   if(signal(SIGUSR1,sig_usr1)==SIG_ERR) 
       err_sys("can't catch S1"); 
   if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR) 
       err_sys("can't catch S2"); 
   for(i=0;i <2;i++)pause(); 
   func(5); 
   //func = sig_usr1; 
   //func(10); 

static void sig_usr1(int signo){ 
   printf("\n usr1\n"); 

static void sig_usr2(int signo){ 
   printf("\n usr2\n"); 

#2


      for(i=0;i   <2;i++)pause();  
      func(5);  
      //func   =   sig_usr1;  
      //func(10);  
}   

不段错误才怪,func(5)时,函数指针func还是个空指针。

#3


http://bbs.chinaunix.net/viewthread.php?tid=993238&extra=page%3D1%26amp%3Bfilter%3Ddigest

#4


高手就是不一樣,我也認爲是func的問題。

#5


执行了下面这句后,func应该还是NULL吧!因为USR1和USR2的缺省处理是IGN。

if((func   =   signal(SIGUSR2,sig_usr2))==SIG_ERR)

#6


讲清楚点嘛
引用 2 楼 cceczjxy 的回复:
      for(i=0;i    <2;i++)pause();   
      func(5);   
      //func   =   sig_usr1;   
      //func(10);   
}    

不段错误才怪,func(5)时,函数指针func还是个空指针。

#7


signal 成功时返回调用前已经安装的信号处理函数的指针.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.

#8


谢谢楼上。

#9


引用 2 楼 cceczjxy 的回复:
      for(i=0;i    <2;i++)pause();   
      func(5);   
      //func   =   sig_usr1;   
      //func(10);   
}    

不段错误才怪,func(5)时,函数指针func还是个空指针。

此时func的值为SIG_DFL即0,所以会出现段错误。。

#10


我还是没懂,因为apue上面也说:
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the function. The return value from signal is the pointer to the previous signal handler.
中文:
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。


为什么我的func没有得到 之前信号处理程序的指针呢?
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

#11


我还是没懂,因为apue上面也说: 
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and 
that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the 
function. The return value from signal is the pointer to the previous signal handler. 
中文: 
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。 


为什么我的func没有得到 之前信号处理程序的指针呢? 
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

#12


引用 11 楼 docong 的回复:
我还是没懂,因为apue上面也说:
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and
that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the
function. The return value from signal is the pointer to the previous signal handler.
中文:
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。 


为什么我的func没有得到 之前信号处理程序的指针呢? 
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

楼主的程序里func已经得到之前信号处理程序的指针. 就是 SIG_DFL.
虽然SIG_DFL或SIG_IGN并没有在程序中设置, 
程序启动时的缺省设置就是SIG_DFL或SIG_IGN;

#13


我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?

#14


引用 13 楼 docong 的回复:
我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?

sig_usr?
是sig_usr1么?
怪不得楼主这么迷惑了,sig_usr1是信号SIGUSR1上的信号处理函数.
func=signal(SIGUSR2,sig_usr2)返回的是先前SIGUSR2上的信号处理函数;在楼主的心里中应该是SIG_DFL.
func=signal(SIGUSR1,sig_usr2)返回的才是sig_usr1.
signal(signum, sig_func)返回的是调用之前安装在signum信号上的信号处理函数的指针.

#15


容我再想想

#16


容我再想想

#1


代码格式有点乱,改了一下
----------------------------------
#include "apue.h" 
#include "error.h" 
static void sig_usr1(int); 
static void sig_usr2(int); 

int  
main(void){ 
   Sigfunc* func; 
   int i=0; 
   if(signal(SIGUSR1,sig_usr1)==SIG_ERR) 
       err_sys("can't catch S1"); 
   if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR) 
       err_sys("can't catch S2"); 
   for(i=0;i <2;i++)pause(); 
   func(5); 
   //func = sig_usr1; 
   //func(10); 

static void sig_usr1(int signo){ 
   printf("\n usr1\n"); 

static void sig_usr2(int signo){ 
   printf("\n usr2\n"); 

#2


      for(i=0;i   <2;i++)pause();  
      func(5);  
      //func   =   sig_usr1;  
      //func(10);  
}   

不段错误才怪,func(5)时,函数指针func还是个空指针。

#3


http://bbs.chinaunix.net/viewthread.php?tid=993238&extra=page%3D1%26amp%3Bfilter%3Ddigest

#4


高手就是不一樣,我也認爲是func的問題。

#5


执行了下面这句后,func应该还是NULL吧!因为USR1和USR2的缺省处理是IGN。

if((func   =   signal(SIGUSR2,sig_usr2))==SIG_ERR)

#6


讲清楚点嘛
引用 2 楼 cceczjxy 的回复:
      for(i=0;i    <2;i++)pause();   
      func(5);   
      //func   =   sig_usr1;   
      //func(10);   
}    

不段错误才怪,func(5)时,函数指针func还是个空指针。

#7


signal 成功时返回调用前已经安装的信号处理函数的指针.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.

#8


谢谢楼上。

#9


引用 2 楼 cceczjxy 的回复:
      for(i=0;i    <2;i++)pause();   
      func(5);   
      //func   =   sig_usr1;   
      //func(10);   
}    

不段错误才怪,func(5)时,函数指针func还是个空指针。

此时func的值为SIG_DFL即0,所以会出现段错误。。

#10


我还是没懂,因为apue上面也说:
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the function. The return value from signal is the pointer to the previous signal handler.
中文:
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。


为什么我的func没有得到 之前信号处理程序的指针呢?
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

#11


我还是没懂,因为apue上面也说: 
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and 
that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the 
function. The return value from signal is the pointer to the previous signal handler. 
中文: 
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。 


为什么我的func没有得到 之前信号处理程序的指针呢? 
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

#12


引用 11 楼 docong 的回复:
我还是没懂,因为apue上面也说:
In plain English, this declaration says that the signal handler is passed a single integer argument (the signal number) and
that it returns nothing. When we call signal to establish the signal handler, the second argument is a pointer to the
function. The return value from signal is the pointer to the previous signal handler.
中文:
用白话说,就是向信号处理程序传送一个整形参数,而他却无返回值。当调用signal设置信号处理程序时,第二个参数是指向该函数(也就是信号处理函数)的指针。signal的返回值则是指向之前的信号处理程序的指针。 


为什么我的func没有得到 之前信号处理程序的指针呢? 
怎样才能得到,还有就是你们说的DFL IGN并没有在程序中设置啊

楼主的程序里func已经得到之前信号处理程序的指针. 就是 SIG_DFL.
虽然SIG_DFL或SIG_IGN并没有在程序中设置, 
程序启动时的缺省设置就是SIG_DFL或SIG_IGN;

#13


我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?

#14


引用 13 楼 docong 的回复:
我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?

sig_usr?
是sig_usr1么?
怪不得楼主这么迷惑了,sig_usr1是信号SIGUSR1上的信号处理函数.
func=signal(SIGUSR2,sig_usr2)返回的是先前SIGUSR2上的信号处理函数;在楼主的心里中应该是SIG_DFL.
func=signal(SIGUSR1,sig_usr2)返回的才是sig_usr1.
signal(signum, sig_func)返回的是调用之前安装在signum信号上的信号处理函数的指针.

#15


容我再想想

#16


容我再想想