于是我写了如下一个函数:
----------------------------
#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");
}
----------------------------------
#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还是个空指针。
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)
if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)
#6
讲清楚点嘛
#7
signal 成功时返回调用前已经安装的信号处理函数的指针.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.
#8
谢谢楼上。
#9
此时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并没有在程序中设置啊
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并没有在程序中设置啊
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
楼主的程序里func已经得到之前信号处理程序的指针. 就是 SIG_DFL.
虽然SIG_DFL或SIG_IGN并没有在程序中设置,
程序启动时的缺省设置就是SIG_DFL或SIG_IGN;
#13
我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?
#14
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");
}
----------------------------------
#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还是个空指针。
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)
if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)
#6
讲清楚点嘛
#7
signal 成功时返回调用前已经安装的信号处理函数的指针.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.
在func(5)时 func的值是if((func = signal(SIGUSR2,sig_usr2))==SIG_ERR)得到的, 应该是SIG_DFL,也就是0,
func(5)当然会出错.
#8
谢谢楼上。
#9
此时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并没有在程序中设置啊
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并没有在程序中设置啊
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
楼主的程序里func已经得到之前信号处理程序的指针. 就是 SIG_DFL.
虽然SIG_DFL或SIG_IGN并没有在程序中设置,
程序启动时的缺省设置就是SIG_DFL或SIG_IGN;
#13
我想我是不是把这个函数理解错了。
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?
我的理解是返回的是一个函数的指针,这个函数指针就是以前函数的指针。
那么应该用func取得了一个sig_usr这个函数的指针啊?
我什么地方理解错了么?
#14
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
容我再想想