BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


SIGALRM失效了。。
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
maxxfire
风云使者



UID:473990
注册:2006-10-9
最后登录: 2008-10-07
帖子:586
精华:0

可用积分:585 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:厦门
状态:...保密...

[个人空间] [短信] [博客]


1楼 发表于 2008-5-23 09:27 
APUE2 10.6节的那个例子。。
#include <pwd.h>
#include <stdio.h>
#include <signal.h>

void err_sys(const char *s )
{
        printf(s);
        exit(0);
}

static void my_alarm(int signo)
{
    struct passwd   *rootptr;

    printf("in signal handler\n");
    if ((rootptr = getpwnam("root")) == NULL)
            err_sys("getpwnam(root) error");
    alarm(1);
}

int main(void)
{
    struct passwd   *ptr;

    signal(SIGALRM, my_alarm);
    alarm(1);
    for ( ; ; ) {
        if ((ptr = getpwnam("mail")) == NULL)
            err_sys("getpwnam error");
        if (strcmp(ptr->pw_name, "mail") != 0)
            printf("return value corrupted!, pw_name = %s\n",
                    ptr->pw_name);
    }
}


信号响应了一次就无法响应第二次了,咋回事。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

在残缺中追寻完美。。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
scutan   帅哥 (冬日夜雨)
精灵使
Linux newbie


CU奥运火炬传递手2008
UID:551201
注册:2007-4-13
最后登录: 2008-10-07
帖子:4845
精华:10

可用积分:4464 (小富即安)
信誉积分:345
专家积分:769 (本版:352)
空间积分:815
推广积分:201

来自:成都
状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2008-5-23 09:34 
signal函数就是这样子的,可以在信号处理函数中再一次调用signal注册,或者使用sigaction函数。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

全力以赴每一秒!
勿在浮砂筑高台!

积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
maxxfire
风云使者



UID:473990
注册:2006-10-9
最后登录: 2008-10-07
帖子:586
精华:0

可用积分:585 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:厦门
状态:...保密...

[个人空间] [短信] [博客]


3楼 发表于 2008-5-23 09:36 


QUOTE:
原帖由 scutan 于 2008-5-23 09:34 发表
signal函数就是这样子的,可以在信号处理函数中再一次调用signal注册,或者使用sigaction函数。

啊,,会这样啊,,这样也行。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

在残缺中追寻完美。。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
maxxfire
风云使者



UID:473990
注册:2006-10-9
最后登录: 2008-10-07
帖子:586
精华:0

可用积分:585 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:厦门
状态:...保密...

[个人空间] [短信] [博客]


4楼 发表于 2008-5-23 10:17 
又发现一个很奇怪的问题,,SIGCLD导致sleep()函数失效。。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sig_cld(int sig)
{
    pid_t   pid;
    int     status;

    printf("SIGCLD received\n");
    if ((pid = wait(&status)) < 0)      /* fetch child status */
        perror("wait error");
    if (signal(SIGCLD, sig_cld) == SIG_ERR) /* reestablish handler */
        perror("signal error");
    printf("pid = %d\n", pid);
}

int main(int argc,char * argv[])
{
        int id;

        if (signal(SIGCLD, sig_cld) == SIG_ERR)perror("signal error");

        if( !(id=fork()) ){
                //child.

                printf("Child[%d] born.\n",getpid());
                sleep(3);
                printf("Child[%d] die.\n",getpid());
                _exit(0);
        }

        //parent.

        sleep(120);
        exit(1);
}


按程序所写,父进程要睡眠2分钟再退出的,可是SIGCLD一到,执行完sig_cld()父进程就退出了。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

在残缺中追寻完美。。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
maxxfire
风云使者



UID:473990
注册:2006-10-9
最后登录: 2008-10-07
帖子:586
精华:0

可用积分:585 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:厦门
状态:...保密...

[个人空间] [短信] [博客]


5楼 发表于 2008-5-23 10:18 
这个signal怎么这样啊,,别这样啊,,我想编程啊。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

在残缺中追寻完美。。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
版主 cugb_cat   帅哥
广告杀手-大法师


CU奥运火炬传递手2008
UID:342049
注册:2005-11-27
最后登录: 2008-10-07
帖子:9733
精华:6

可用积分:9415 (腰缠万贯)
信誉积分:110
专家积分:434 (本版:115)
空间积分:0
推广积分:10

来自:北京海淀中关村
状态:...保密...

[个人空间] [短信] [博客]


6楼 发表于 2008-5-23 10:29 
换sigaction试试



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

欢迎访问ToFree社区
www.tofree.org

积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
maxxfire
风云使者



UID:473990
注册:2006-10-9
最后登录: 2008-10-07
帖子:586
精华:0

可用积分:585 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:厦门
状态:...保密...

[个人空间] [短信] [博客]


7楼 发表于 2008-5-23 10:48 
对不起,又出现一个问题,sleep导致SIGCLD失效,上面那个程序稍微改一下:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void sig_cld(int sig)
{
    pid_t   pid; int     status;

    printf("SIGCLD received\n");
    if ((pid = wait(&status)) < 0)      /* fetch child status */
        perror("wait error");
    if (signal(SIGCLD, sig_cld) == SIG_ERR) /* reestablish handler */
        perror("signal error");
    printf("sighandler get child pid = %d\n", pid);
}

int main(int argc,char * argv[])
{
        int id,stat,pid,i;

        if( !(id=fork()) ){
                //child.

                printf("Child[%d] born.\n",getpid());
                sleep(1);
                printf("Child[%d] die.\n",getpid());
                _exit(0);
        }

        //parent.

        sleep(5);
        if (signal(SIGCLD, sig_cld) == SIG_ERR)perror("signal error");
        sleep(3);

        exit(1);
}


父进程sleep(5)后就直接退出了,sig_cld()未被执行,sleep(3)也未被执行。
似乎sleep与SIGCLD之间有冲突。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

在残缺中追寻完美。。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
dxbh
圣骑士




UID:696831
注册:2008-4-25
最后登录: 2008-10-06
帖子:147
精华:0

可用积分:166 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-5-23 11:10 


QUOTE:
原帖由 maxxfire 于 2008-5-23 10:48 发表
对不起,又出现一个问题,sleep导致SIGCLD失效,上面那个程序稍微改一下:
#include
#include
#include

void sig_cld(int sig)
{
    pid_t   pid; int     status;

    printf("SIGCLD received ...

你sleep(5)后,子进程早退出了,你连SIGCHLD都没有注册,抓得到信号才怪



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Sorehead   帅哥
光明使者




UID:161134
注册:2004-5-27
最后登录: 2008-09-25
帖子:763
精华:0

可用积分:928 (稍有积蓄)
信誉积分:100
专家积分:40 (本版:40)
空间积分:0
推广积分:0

来自:北京
状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-5-23 12:30 
开始的时候总是觉得很多问题不可思议、不能理解,慢慢懂得多了就好了。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
lanying_wzw
精灵王




UID:151974
注册:2004-4-15
最后登录: 2008-10-05
帖子:280
精华:0

可用积分:314 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-5-23 19:37 
sleep()一般是用SIG_ALRM实现的,所以遇到任何信号都会返回,所以睡不够要求的秒数。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.158322 second(s), 4 queries , Gzip enabled