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

求救。。关于signal

    来源: 互联网  发布时间:2017-01-29

    本文导语:  #include  #include  #include                                                                                             void my_func(int sign_no) {         if(sign_no==SIGINT)   ...

#include 
#include 
#include 
                                                                                          
void my_func(int sign_no)
{
        if(sign_no==SIGINT)
                printf("I have get SIGINTn");
        else if(sign_no==SIGQUIT)
                printf("I have get SIGQUITn");
}
int main()
{
        printf("Waiting for signal SIGINT or SIGQUIT n ");
                                                                                          
        /*注册信号处理函数*/
        signal(SIGINT, my_func);
        signal(SIGQUIT, my_func);                                                                                          
        pause();
        exit(0);
}

问题“
signal的原型是:void (*signal(int signo,void (*func)(int))) (int)
       
那么这两行代码注册信号的代码中signal(SIGINT, my_func);signal(SIGQUIT, my_func)
怎么没有原型中最外层的int型参数。有点困惑。。


        

|
因为有人发现,对于singal函数,用typedef处理一下,可以写成更简单的方式。
于是有了这个定义,typedef void (*sighandler_t)(int);
那么void (*signal(int signo, void (*func)(int)))(int); 就转换成下面的样子:
sighandler_t signal(int signum, sighandler_t handler);

就是typedef加函数指针。算是typedef的特殊用法,至于为什么这样用,一起等楼下高人解释。我也没明白原理,所以感觉有点“违反直觉”。看这个简单的例子:

#include 

int add(int a, int b)
{
        return a + b;
}

int sub(int a, int b)
{
        return a - b;
}

int (*calc)(int a, int b);
typedef int (*Func)(int a, int b);

int main(void)
{
        int a = 3, b = 4;
        Func fc;
        calc = add;
        printf("%dn", calc(a, b));
        fc = sub;
        printf("%dn", fc(a,b));
        return 0;
}

|

确实,有点晕,分而治之就简单了
     #include 

     void (*signal(int sig, void (*func)(int)))(int);

     or in FreeBSD's equivalent but easier to read typedef'd version:

     typedef void (*sig_t) (int);

     sig_t
     signal(int sig, sig_t func);

http://www.freebsd.org/cgi/man.cgi?query=signal&apropos=0&sektion=0&manpath=FreeBSD+8.2-RELEASE&arch=default&format=html

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求救!求救!紧急求救!为什么更新不了所指定的内容?
  • 求救!!!硬件高请进、、、、、、(十万火急,高分求救。)
  • 求救求救!!
  • 求救啊 高分求救 UNIX下关于进程通讯的问题~
  • 求救!!!求救!!!机器不能正常启动
  • 关于jdbc,求救求救!在线等待,马上给分
  • 紧急求救,root用户无权限删除文件
  • 晕,特晕...求救...
  • 高分求救~~如何取得linux下进程完整命令行字符串,就是的ps -ef 完整的全路径的CMD那一列,求救!!!!附现在的代码
  • 求救!weblogic6.0后台运行正确,前台页面跳转或调用其他页面时出“页面无法显示错误”
  • 求救:java里如何取整一个浮点数(不做四舍五入)
  • 紧急求救!!
  • Linux下无法启动apache 高分求救!在线等待
  • 紧急求救 我用freebsd通过smbfs连接win2000的一些问题 (分不够可加)
  • 紧急求救 我用freebsd通过smbfs连接win2000的一些问题
  • 求救,linux和windows之间如何联成局域网(设置),并且相互之间移动文件。
  • 求救!!在Redhat7.3下安装scim0.9.3怎么安装?
  • Linux8.0 修改字符集后,再次进系统,无图形界面问题。。。求救。。
  • SUSE网络打印机问题,在线等,求救!!
  • 散分一百,紧急求救!ROOT密码忘记


  • 站内导航:


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

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

    浙ICP备11055608号-3