当前位置:  技术问答>IP地址数字互转 iis7站长之家

>>>signal函数之怪现象

    来源: 互联网  发布时间:2015-03-17

    本文导语:  read程序可能产生阻塞现象,所以我采用signal函数来定时。 ...          signal(SIGALRM,sigint_handler);          alarm(5);          nbytes = read(connfd,buf,1024);          alarm(0); ... 其中sigint_handler是只有return 的...

read程序可能产生阻塞现象,所以我采用signal函数来定时。

...
         signal(SIGALRM,sigint_handler);
         alarm(5);
         nbytes = read(connfd,buf,1024);
         alarm(0);
...
其中sigint_handler是只有return 的函数。

现在的问题是:我经过测试,发现执行sigint_handler之后,程序回到read函数继续执行(因为这个时候客户端write数据的时候read函数能返回正常的结果)。

问题:我怎么才能实现read函数返回 EINTR 结果呢??????





珠江路上超强的IT厕所

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

昨日,去逛电脑城,突然觉得一阵腹痛,不好,要如厕。 

急匆匆来到WC前,抬头只见门口上方挂一电子牌:上写 

“WINDOWS XP HOME WC” 

不禁赞叹:不愧是珠江路,果然是IT,高科技! 

好急,快进去,怎么门推不开?抬头一看,电子板上显示: 

“用户名不存在或密码错误,请找管理员” 

给看门老头交了五毛钱,拿了个密码,急忙入内,冲向马桶 

可是马桶盖怎么也打不开,我实在忍不住了,用力一拉,墙上弹出一块牌子: 

“!系统提示:您没有这个马桶的访问权限” 

**!好在我知道一个超级用户密码,这时起了作用,在控制面板中输入后, 

马桶盖终于打开了…..长输了一口气,好舒服哦。 

完事,伸手去拿手纸,手纸却又没法从盒子里抽出来,不会吧,难道? 

一转头,果然,又弹出了一个牌子 

“此纸盒已加密!” 

我晕,正在急不可耐时,旁边蹲位有人伸过来一只手: 

“你第一次用WINXP WC吧,没关系,我们手纸共享好了” 

谢谢,谢谢, 边道谢,边提好裤子, 

一冲马桶,又弹一牌子: 

“病毒已清除!” 

刚走两步,只听“砰”的一声,马桶盖大力的关上了,牌子上道: 

“连接超时,请刷新!” 

好险!!!  

|
使用setjmp/longjmp函数。
#include 
#include 
#include 

static void sig_alrm(int)
static jmp_buf env_alrm;
int main(void)
{
if(signal( SIGALRM, sig_alrm)  == SIG_ERR ) {
   perror(argv[0]);exit(1);
}
if ( setjmp(env_alrm) != 0  ) {
   printf("read time out" );
   exit(1);
}
alarm(10);
nbytes = read(connfd,buf,1024);
alarm(0);
exit(0);
}

static void
sig_alrm(int signo)
{
longjmp(env_alrm,1);
}

|
read()系统调用被信号中断就会返回errno=4, 即EINTR, 但是, os不同, 也不一定, 这是就看系统是否运行"被中断的系统调用是否继续运行"了, 即SA_RESTART标志了, 在sco和aix上默认是关SA_RESTART标志的, 在solaris上好像是开的.
如下程序:就返回errno为EINTR
#include 
#include 
#include 
#include 
#include 

void sigalrm_hander( int signo )
{
printf( "in sigalrm_hander()n");
return;
}
extern int errno;


main()
{
int nbyte;
char buff[200];

signal( SIGALRM, sigalrm_hander);
alarm( 5 );
nbyte = read( 1, buff, sizeof(buff)-1); 
alarm( 0);
printf( "main() end, nbyte = %d, errno = %d %sn", nbyte, errno, strerror(errno));
return 0;
}
此程序在aix上运行, 返回
in sigalrm_hander()
main() end, nbyte = -1, errno = 4 Interrupted system call

但如下程序
#include 
#include 
#include 
#include 
#include 

void sigalrm_hander( int signo )
{
printf( "in sigalrm_hander()n");
return;
}
extern int errno;
void set_signal_handle( void )
{
struct sigaction act;
    
    memset( &act, 0, sizeof(struct sigaction) );
    act.sa_handler = sigalrm_hander;
    sigemptyset( &act.sa_mask );
    
#ifdef SA_RESTART
act. sa_flags= SA_RESTART;
#endif
    sigaddset( &act.sa_mask, SIGALRM );
    sigaction( SIGALRM,  &act, NULL );
    
return; 
}


main()
{
int nbyte;
char buff[200];

set_signal_handle();
alarm( 5 );
nbyte = read( 1, buff, sizeof(buff)-1); 
alarm( 0);
printf( "main() end, nbyte = %d, errno = %d %sn", nbyte, errno, strerror(errno));
return 0;
}
在aix下运行, 返回

in sigalrm_hander()// 信号程序执行后, 主程序没有退出
asdfsaf // 这时输入并回车
main() end, nbyte = 7, errno = 82 Restart the system call

如果把上面两个程序的信号处理的return改为exit(1), 则不论什么情况, 主程序都退出




!!!!!!!!!如果答对了你的问题, 一定要给分!!!!!!!!!!!!!!!


    
 
 

您可能感兴趣的文章:

  • 请教signal函数的用法!
  • signal函数定义该怎么理解?
  • 请问有没头函数<pthread.h>和<signal.h>里的函数的详细功能介绍?和使用方法???
  • 关于signal函数
  • 关于系统信号处理函数signal()的疑问.
  • signal的处理函数问题
  • 关于signal函数的问题
  • signal函数的定义问题?搞不懂.
  • signal函数使用出问题?
  • signal 函数请教
  • 关于signal函数的问题,大家帮我看看
  • 关于linux下的signal函数的问题
  • 在signal指定的处理函数中如何传进去一个值?
  • 向各位求助:关于signal函数
  • REDHAT LINUX 9中如何使用signal这个函数进行中断通信?
  • 谁能给我解释一下SIGNAL这个函数呀?
  • signal处理函数中的文件操作问题
  • 请问:signal(), sigaction()函数会不会使自已所有的进程挂起啊,(这样就等接收各种信号,进行一些处理工作啊)
  • 谁给解释下这个signal函数
  • linux中信号signal函数实例遇到的疑问
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.concurrent.locks接口condition的类成员方法: signal定义及介绍
  • signal 7和signal 11
  • 关于signal信号
  • 关于signal返回值是什么?
  • pending signal
  • 关于Linux驱动中signal的使用
  • about "signal"
  • 有关signal handler,请教!
  • signal handler 问题
  • signal的疑惑
  • 关于signal ()
  • signal和sigaction区别
  • PPP问题fatal signal 11
  • C/C++语言问题:(void) signal(SIGPIPE, pstat); 是什么意思?
  • alarm() 和 signal()的问题
  • ***************unix 系统中,信号量(signal)被屏蔽了,怎么开(是在命令行超作,不是在程序中)
  • 在类中使用signal编译不通过
  • signal()基础知识,<<apue>>上的程序疑问
  • Program received signal SIGPIPE, Broken pipe. 这是什么回事?
  • 如何将自定义的信号发给signal表记的进程?
  • 急急急!gdb下Program received signal SIGABRT, Aborted.是什么错误?


  • 站内导航:


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

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

    浙ICP备11055608号-3