免费注册 查看新帖 |

Chinaunix

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

[C] 子进程接受到信号为什么不会输出信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-13 11:27 |只看该作者 |倒序浏览
大大们好,菜鸟问个小问题。
先上代码:
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
static void    sig_usr(int);    /* one handler for both signals */

int
main(void)

{   
    pid_t childpid;
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        perror("can't catch SIGUSR1");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        perror("can't catch SIGUSR2");
   
   
    if (  ( childpid = fork() ) < 0) perror("fork error");
        else if ( childpid > 0 ) {
        printf("child pid = %d\n",childpid);
        while(1) pause();
        }
        
    else{
        while(1){
        sleep(5);
        //while(1) pause(); //waiting signal to wake up ...

        printf("sending sig1...\n");
        kill(SIGUSR1,childpid);
        printf("sending sig2...\n");
        kill(SIGUSR2,childpid);
        }
        
        }
}
static void
sig_usr(int signo)        /* argument is signal number */
{
    if (signo == SIGUSR1)
        printf("received SIGUSR1\n");
    else if (signo == SIGUSR2)
        printf("received SIGUSR2\n");
    else
        printf("received signal %d\n", signo);
}


把上述的代码保存为test1.c
编译选项:gcc  test1.c
执行的时候直接在bash下执行 ./a.out

----------------------------------------------

当另一种代码形式:

#include <unistd.h>
#include <signal.h>
static void    sig_usr(int);    /* one handler for both signals */

int
main(void)
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        perror("can't catch SIGUSR1");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        perror("can't catch SIGUSR2");
    for ( ; ; )
        pause(); //waiting signal to wake up ...

}

static void
sig_usr(int signo)        /* argument is signal number */
{
    if (signo == SIGUSR1)
        printf("received SIGUSR1\n");
    else if (signo == SIGUSR2)
        printf("received SIGUSR2\n");
    else
        printf("received signal %d\n", signo);
}


保存为test2.c
编译同上,在当前的bash环境下执行 ./a.out &   ,得到pidnum(比如 27100)

然后,输入命令 : kill - USR1 27100   则会在当前的bash环境下输出  received SIGUSR1。

----------------------------------------------------------------------

小菜我的问题就是:
1.为什么采用方式1时,子进程不会输出信息?而我采取在bash环境下发送信号的方式,进程会输出信息???

2.有什么方法可以让test1.c 中的子进程运行时,输出printf语句?

[ 本帖最后由 wpclub 于 2009-4-13 11:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-13 11:50 |只看该作者
lz我想打人。

int kill(pid_t pid, int sig);

论坛徽章:
0
3 [报告]
发表于 2009-04-13 12:01 |只看该作者
原帖由 79hy 于 2009-4-13 11:50 发表
lz我想打人。

int kill(pid_t pid, int sig);

论坛徽章:
0
4 [报告]
发表于 2009-04-13 12:26 |只看该作者
han...............

低级失误,呵呵

论坛徽章:
0
5 [报告]
发表于 2009-04-13 12:36 |只看该作者
原帖由 wpclub 于 2009-4-13 12:26 发表
han...............

低级失误,呵呵

printf是不可重入函数,你这也不一定输出啥。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP