|
|
|
|
 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)]
|
|
|
|
[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]
|
|
[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]
|
|
|