永发信息网

Linux中SIG_ERR值是什么

答案:2  悬赏:20  手机版
解决时间 2021-03-17 17:07
Linux中SIG_ERR值是什么
最佳答案
纠正一下:
输出in sig_fun1:30就是第二次调用的时候输出的,第一次调用只是绑定了SIGUSR1的信号处理函数,不会进入该处理函数

为什么会有这样的输出呢?
signal函数是将信号与处理函数进行绑定,成功绑定则返回绑定之前的信号处理函数。那么来看看你的代码,第一次调用将sig_fun1绑定,无输出;第二次调用将sig_fun2绑定,也就是把sig_fun1替换下来,并且你还调用了它,参数为30,所以会有那样的输出。

该如何改呢?
其实你并没有涉及到linux的信号处理机制,光绑定是不够的,还需要发信号给它,才能真正进入信号处理过程。给你一个示例代码吧
#include
#include
#include
#include

void sig_fun2(int signo)
{
printf("in sig_fun2:%d\n", signo);
}

void sig_fun1(int signo)
{
printf("in sig_fun1:%d\n", signo);
}

int main()
{
unsigned long i;
if (signal(SIGUSR1, sig_fun1) == SIG_ERR)
{
printf("signal fun1 error\n");
exit(1);
}
sleep(15);

(signal(SIGUSR1, sig_fun2))(30);
sleep(15);

printf("done\n");
return 0;
}

首先编译,假设生成可执行程序为test
然后运行,我用的是后台运行: nohup ./test>output.txt &
注意,这种方法要将输出重定向到文件output.txt(名字无所谓),然后你会看到一个数字,就是pid进程号
最后,在15秒之内发送信号:kill -SIGUSR1 进程号
现在你就可以打开output.txt看输出结果了。如果用sleep的话会被打断,所以只有两个输出加上替换处理函数时的输出共3个,也可以换成 int n=15;while(n--)sleep(1);
-------------------------------------------------------------
怎么样,加分吧
-------------------------------------------------------------
1.我就是想问第二次绑定sig_fun2的时候,调用了第一次绑定的sig_fun1么?
调用了, (signal(SIGUSR1, sig_fun2))(30);就是这一句, signal(SIGUSR1, sig_fun2)是个函数指针,你这样写就是调用它了,但是这和信号处理没关系,写成signal(SIGUSR1, sig_fun2);就可以了
这就是你所说的成功则返回绑定之前的函数???

那当时绑定sig_fun1的时候,返回之前的处理函数是什么??
这个就是系统默认的了,比如SIGINT就是你ctrl+c取消程序执行发送的信号,它的处理函数就是结束程序的一系列动作,不过SIGUSR1是留给用户自定义的信号,系统默认应该是啥也不做的一个函数,例如void fun(int signo){},你也可以第一次绑定的时候就调用试试看对不对

2.还有我在看signal函数定义的时候,void(//...)(int) 最后传入的这个int整形参数就是我们自定义sig_fun()中所接收的30么??我看例子里面有的signal(SIGINT,myfunc);也没有带参数啊,搞不懂
是你理解错了,signal函数只是绑定,没涉及到调用绑定函数,不用带参数,信号处理函数不是像你这样调用的。callback回调你知道吧,就是先做好一个函数或过程放着,事件触发的时候才调用。那个30是你用普通函数调用的方式时的参数,跟信号处理一点关系也没有,你用60,70也没半毛钱关系。我猜你是想要调用信号处理函数,然后迷糊了,其实我上面说的“kill -SIGUSR1 进程号”就是触发程序调用该处理函数的信号,这和kill -9 杀死进程一个道理,只不过处理函数不同,结果不一样。ctrl+c也可以用信号的方式发送,kill -2 进程号,或者 kill -SIGINT 进程号
全部回答
sig_err它表示一个函数指针,如果不出错的话,signal()会返回以前的信号处理函数的地址。 你的siguser1定义了吗?默认的话,系统没有这一个信号 sig_err是这样定义的 #define sig_err (void (*) () ) -1
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
迁户口还需要计生证明吗?计生证明还需体检吗
凯旋鸿达宾馆在什么地方啊,我要过去处理事情
和朋友逛街,走半路高跟靴的鞋跟掉了。怎么办
良乡大角家乐福二楼抽奖卖玉真吗家乐福里面让
江湖堂地址在什么地方,想过去办事
有限公司董事长工资由谁来定
1岁9个月的宝宝一天的奶量应该是多少
小鸡手柄g3家庭版p啪啪模拟器可以用吗
梦到老家新盖的房子顶塌了
如何清理手机缓存和离线数据
彭加瓦念什么拼音
塑料厂是否有毒?
50kw用多大的三相电缆
飞扬通讯这个地址在什么地方,我要处理点事
阿斌国道鱼土菜馆地址有知道的么?有点事想过
推荐资讯
覃记江湖翅客在什么地方啊,我要过去处理事情
固定资产折旧费可以偿还借款啥意思?买去的旧
斌斌湘菜酒家地址在什么地方,想过去办事
剧组妆和影楼妆有什么不一样
怎样办理海运舱单的申报
主人公收服了雨之希留还有其他的越狱大海贼的
蒸发1kg乙酸乙酯需要多少热能
南塔公园这个地址在什么地方,我要处理点事
肇庆买社保可以在广东省内使用吗?
双向油缸用了一个月之后活塞杆上的电镀层掉落
晟源装潢建材商店我想知道这个在什么地方
pos机掉地摔坏了,出纸口都送动了,卡不了纸
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?