免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3488 | 回复: 7
打印 上一主题 下一主题

[函数] 高手帮忙讲讲SIGNAL函数原形定义什么意思,详情见内 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-10 06:43 |只看该作者 |倒序浏览
1、signal 系统调用

        系统调用signal用来设定某个信号的处理方法。该调用声明的格式如下:
        void (*signal(int signum, void (*handler)(int)))(int);

个人理解:  signal函数有两个参数 int 和void ,返回值指向一个带有INT 参数 返回VOID的函数

2.       上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
     typedef void (*sighandler_t)(int);
        sighandler_t signal(int signum, sighandler_t handler);

个人理解: typedef void (*sighandler_t)(int);   
              sighandler_t是个指针,指向带有INT参数返回为VOID函数的首地址.
            所以void (*signal(int signum, void (*handler)(int)))(int) ;可以改写成 sighandler_t signal(int signum, sighandler_t handler);

3.     实际调用
   
    #include <signal.h>
        #include <unistd.h>
        #include <stdio.h>
        void sigroutine(int dunno) { /* 信号处理例程,其中dunno将会得到信号的值 */
        switch (dunno) {
        case 1:
        printf("Get a signal -- SIGHUP ";
        break;
        case 2:
        printf("Get a signal -- SIGINT ";
        break;
        case 3:
        printf("Get a signal -- SIGQUIT ";
        break;
        }
        return;
        }

        int main() {
        printf("process id is %d ",getpid());
        signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法
     signal(SIGINT, sigroutine);
        signal(SIGQUIT, sigroutine);
        for (; ;
        }

   void sigroutine(int dunno) 中 参数dunno是如何传递的?是在signal中调用了handler(int )?

函数SIGNAL返回值是一个函数的地址 有什么意义吗? 系统要用到这个地址?
请大家帮忙讲清楚


[ 本帖最后由 houhulou 于 2008-6-10 06:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-10 10:10 |只看该作者
个人理解:  signal函数有两个参数 int 和一个函数指针,

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2008-06-10 10:12 |只看该作者
哥们,好好看《unix环境高级编程》第十章。

论坛徽章:
0
4 [报告]
发表于 2008-06-10 10:35 |只看该作者
个人理解:  signal函数有两个参数 int 和void ,返回值指向一个带有INT 参数 返回VOID的函数

signal有两个参数,一个是int,另一个是函数指针(指向自己指定的信号处理程序),返回值是函数指针(指向原先的信号处理程序)。
先把C的声明弄明白,可以搜索“右左法则”,或查一下《C专家编程》
然后再看看APUE(《UNIX环境高级编程》)

论坛徽章:
0
5 [报告]
发表于 2008-06-10 10:39 |只看该作者
返回该信号的上一次的处理配置, 比如说SIG_IGN, SIG_DFL, 或者你上次注册的处理函数等,
用处, APUE上有一例:
if(signal (SIGINT, SIG_IGN) != SIG_IGN))
    signal(SIGINT, sig_int);
仅当信号当前未被忽略时, 进程才扑捉它

论坛徽章:
0
6 [报告]
发表于 2008-06-10 11:27 |只看该作者
void sigroutine(int dunno) 中 参数dunno是如何传递的?是在signal中调用了handler(int )?

signal只是注册一下该函数,并不会调用它。信号产生后,系统会去调用的。

函数SIGNAL返回值是一个函数的地址 有什么意义吗? 系统要用到这个地址?

返回值是上次的处理函数指针,系统并不会用,是给应用程序使用的,有些情况下,需要把信号处理恢复到以前的状态,这个时候就用上了。

论坛徽章:
0
7 [报告]
发表于 2008-06-10 11:48 |只看该作者
原帖由 Sorehead 于 2008-6-10 11:27 发表

signal只是注册一下该函数,并不会调用它。信号产生后,系统会去调用的。


返回值是上次的处理函数指针,系统并不会用,是给应用程序使用的,有些情况下,需要把信号处理恢复到以前的状态,这个时候就用上了。

正解!

论坛徽章:
0
8 [报告]
发表于 2008-06-10 18:18 |只看该作者

回复 #1 houhulou 的帖子

谢了 楼上各位
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP