LinuxSir.cn,穿越时空的Linuxsir!

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

请教一个关于“信号”的程序问题

[复制链接]
发表于 2006-4-4 19:31:39 | 显示全部楼层 |阅读模式
#include<sys/time.h>
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>

struct timeval tv;
//struct timezone tz;
//struct itimerval itv;

/* The part of signal handler function */
static void sig_handler(){
        printf("SIGPROF has been arrived\n");
        itv.it_interval.tv_sec=1;
        itv.it_interval.tv_usec=0;
        itv.it_value.tv_sec=1;
        itv.it_value.tv_usec=0;
        setitimer(ITIMER_REAL,&itv,NULL);
}

/* The main() function */
main(){
        /* initial the ITIMER */
        itv.it_interval.tv_sec=1;
        itv.it_interval.tv_usec=0;
        itv.it_value.tv_sec=1;
        itv.it_value.tv_usec=0;
      
        setitimer(ITIMER_REAL,&itv,NULL);

        /* register SIGUSRx'handler: sig_handler */
        signal(SIGPROF,sig_handler);
}


我想每秒产生一个信号,然后输出一段话~
可为什么现在一点反映也没有呢?
发表于 2006-4-5 04:18:29 | 显示全部楼层
老大,你哪里搞来的这段程序,错得一塌糊涂啊。好了,不打击你了,给你答案:
你的程序两个问题:
1, 你的程序运行到signal函数后就exit了,当然什么也没发生了! 你要想让程序挂起等待信号,不pause哪行啊? 解:
在signal后加
while (1)
pause ();
2, 这样还是不行,为什么,你将ITIMER_REAL作为setitimer的第一个参数,超时的时候你收到的不是SIGPROF,而是SIGALRM,将signal函数改成signal (SIGALRM, sig_handler);就行了。或者将setitimer的第一个参数改成ITIMER_PROF。这取决于你的需求(即你想要什么样的定时器)

上面开个玩笑,别见怪。
回复 支持 反对

使用道具 举报

发表于 2006-4-5 07:55:58 | 显示全部楼层
楼上的你确信“或者将setitimer的第一个参数改成ITIMER_PROF”吗? 我昨天试过:将  signal(SIGPROF,sig_handler);  换成 signal(SIGALRM,sig_handler); 是可以的;但是将  setitimer(ITIMER_REAL,&itv,NULL); 换成 setitimer(ITIMER_PROF,&itv,NULL); 却死活不行。 我的实验环境是
gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)


GNU C Library stable release version 2.3.3, by Roland McGrath et al.
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3).
Compiled on a Linux 2.4.20 system on 2004-10-27.
Available extensions:
        GNU libio by Per Bothner
        crypt add-on version 2.1 by Michael Glad and others
        linuxthreads-0.10 by Xavier Leroy
        The C stubs add-on version 2.1.2.
        BIND-8.2.3-T5B
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
        Glibc-2.0 compatibility add-on by Cristian Gafton
        GNU Libidn by Simon Josefsson
        libthread_db work sponsored by Alpha Processor Inc
Thread-local storage support included.


请问楼上的是什么样的环境?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-5 09:03:09 | 显示全部楼层
Post by littlepig
老大,你哪里搞来的这段程序,错得一塌糊涂啊。好了,不打击你了,给你答案:
你的程序两个问题:
1, 你的程序运行到signal函数后就exit了,当然什么也没发生了! 你要想让程序挂起等待信号,不pause哪行啊? 解:
在signal后加
while (1)
pause ();
2, 这样还是不行,为什么,你将ITIMER_REAL作为setitimer的第一个参数,超时的时候你收到的不是SIGPROF,而是SIGALRM,将signal函数改成signal (SIGPROF, sig_handler);就行了。或者将setitimer的第一个参数改成ITIMER_PROF。这取决于你的需求(即你想要什么样的定时器)

上面开个玩笑,别见怪。


呵呵,谢谢了~~不好意思~~
学到不少东西~~
回复 支持 反对

使用道具 举报

发表于 2006-4-5 15:52:08 | 显示全部楼层
我的错我的错,把楼主给忽悠了,我这用setitimer(ITIMER_PROF...),也收不到信号,古怪,被man给骗了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-5 18:59:24 | 显示全部楼层
Post by littlepig
我的错我的错,把楼主给忽悠了,我这用setitimer(ITIMER_PROF...),也收不到信号,古怪,被man给骗了?

setitimer()的地方没有变,signal的时候改成SIGALRM了。你已经给了我很大的提示了,呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

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