LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1051|回复: 3

新手请教,signal函数的返回值到底是什么?

[复制链接]
发表于 2009-8-2 13:17:37 | 显示全部楼层 |阅读模式
我编译运行了如下代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void fun(int sig)
{
    if(34==sig)
        printf("\n34 recieve\n");
    if(35==sig)
        printf("\n35 recieve\n");
}

int main(int argc,char *argv[],char *env[] )
{
    pid_t pid;
    void (*pfun)(int);

    if((pid=fork())>0)
    {
//        sleep(1);
        kill(pid,34);
        exit(0);
    }

    signal(34,fun);
    pfun=fun;
    pfun(35);

    pause();

    return 0;
}
函数输出:
35 recieve

34 recieve

而把程序改成:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void fun(int sig)
{
    if(34==sig)
        printf("\n34 recieve\n");
    if(35==sig)
        printf("\n35 recieve\n");
}

int main(int argc,char *argv[],char *env[] )
{
    pid_t pid;
//    void (*pfun)(int);

    if((pid=fork())>0)
    {
        sleep(1);
        kill(pid,34);
        exit(0);
    }

    signal(34,fun)(35);
//    pfun=fun;
//    pfun(35);

    pause();
    return 0;
}
或者:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void fun(int sig)
{
    if(34==sig)
        printf("\n34 recieve\n");
    if(35==sig)
        printf("\n35 recieve\n");
}

int main(int argc,char *argv[],char *env[] )
{
    pid_t pid;
    void (*pfun)(int);

    if((pid=fork())>0)
    {
        sleep(1);
        kill(pid,34);
        exit(0);
    }

    pfun=signal(34,fun);
//    pfun=fun;
    pfun(35);

    pause();
    return 0;
}

就会不 产生任何输出!这是为什么?

我 看一些资料上说signal函数返回的 就是关联上的函数的地址,为什么我后面的调用方式失败,但编译通过。
发表于 2009-8-2 17:27:15 | 显示全部楼层
看的啥资料
man 3 signal吧
RETURN VALUE
       If  the request can be honored, signal() shall return the value of func
       for the most recent call to signal() for the specified signal sig. Oth‐
       erwise,  SIG_ERR shall be returned and a positive value shall be stored
       in errno.
返回的是上次设置的回调函数指针
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-2 18:59:02 | 显示全部楼层
楼上的老大,为什么不解答一下我的问题?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-4 20:47:41 | 显示全部楼层
不好意思是我弄错了,我现在搞懂了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表