URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 26 » scanf时遇到signal会怎样??
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
scanf时遇到signal会怎样??
scanf时遇到signal会怎样?? - keyinwind [2005-08-31 13:54 | 513 byte(s)]
 
Re: scanf时遇到signal会怎样?? - zhllg [2005-08-31 18:28 | 1,622 byte(s)]
 
Re: scanf时遇到signal会怎样?? - keyinwind [2005-09-01 14:18 | 15 byte(s)]
 
Re: scanf时遇到signal会怎样?? - kangjie501 [2005-08-31 17:25 | 26 byte(s)]
 
Subject: scanf时遇到signal会怎样??
Author: keyinwind    Posted: 2005-08-31 13:54    Length: 513 byte(s)
[Original] [Print] [Top]
while(1)
{
printf("1");
scanf("%c", c);
printf("2");
}

如果在scanf时遇到一个SIGALRM,然后去执行该signal action,如:
do_sigalrm()
{
printf("sigalrm ");
}

然后程序不会继续停在scanf里,而是跳出scanf而执行下面的printf 2,这是因为什么原因,scanf是可重入函数吗???如果在不可重入函数执行过程中,发生这种信号处理,会发生什么情况??不懂程序为什么会往下执行
[Original] [Print] [Top]
Subject: Re: scanf时遇到signal会怎样??
Author: kangjie501    Posted: 2005-08-31 17:25    Length: 26 byte(s)
[Original] [Print] [Top]
printf应该是不可重入的吧。
[Original] [Print] [Top]
Subject: Re: scanf时遇到signal会怎样??
Author: zhllg    Posted: 2005-08-31 18:28    Length: 1,622 byte(s)
[Original] [Print] [Top]
是否可重入,本质上是看它有否使用全局或者静态变量。有,就不可重入;反之,可重入
可重入字面意义是,如果一个函数尚未返回时收到一个信号,信号处理函数里又调用了同一个函数,如果此函数可重入,那么两次函数调用结果正常,否则可能有严重后果,比如malloc,可造成内存泄露。
多线程的情况下也会有类似的问题

你这个问题实质是system call被信号中断后是否可重新开始的问题(whether system call is restartable across signal)
这里scanf用的system call是read(2)

可以看看这个程序 test.c
#include<signal.h>
#include<stdio.h>
#include<unistd.h>

void handler(int s){
printf("ctrl+z pressed ");
}
int main(){
int i = 0;
char c;

struct sigaction action;

action.sa_handler = handler;
sigemptyset(&action.sa_mask);
#ifdef RESTART
action.sa_flags = SA_RESTART;
#else
action.sa_flags = 0;
#endif

sigaction(SIGTSTP, &action, NULL);

while(1){
printf("loop %d ", ++i);
scanf("%c", &c);
printf("you've entered: %c ", c);
}
}

编译:
gcc -DRESTART test.c -o restartable
gcc test.c -o norestart

运行restartable和norestart,比较一下区别
----
[Original] [Print] [Top]
Subject: Re: scanf时遇到signal会怎样??
Author: keyinwind    Posted: 2005-09-01 14:18    Length: 15 byte(s)
[Original] [Print] [Top]
恩,懂了, 拜谢!
[Original] [Print] [Top]
« Previous thread
关于/lib/libcrypto.so.4 的版本和sshd的匹配问题
C/C++编程版
26
Next thread »
为什么elf 文件section header table 中bss段的大小总为0?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:39, cost 0.042517900466919 ms.