进程“慢”系统调用,如果发生了信号,内核会重启系统调用
慢系统调用:
可能会永远阻塞的系统调用
从终端设备,管道,或者网络设备上的文件读取
向上述文件写入
某些设备上的文件打开
pause和wait系统调用
一些设备ioctl操作
一些进程间通信函数
系统中断调用信号处理函数重新执行
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> void set_signal(int signo) { printf("set signal %d\n",signo); } int main() { char buffer[512]; ssize_t size; if(signal(SIGTSTP,set_signal)==SIG_ERR) { printf("signal error\n"); } printf("main start reading a file\n"); size=read(STDIN_FILENO,buffer,512); if(size <0) { printf("reading error\n"); } printf("reading finished\n"); if(write(STDIN_FILENO,buffer,size)!=size) { printf("write error\n"); } return 0; }
用户函数调用,信号处理函数未重新执行
#include <signal.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> void set_signal(int signo) { printf("signal call %d\n",signo); } void user_call() { printf("user run start\n"); sleep(10); printf("user run end\n"); } int main() { if(signal(SIGTSTP,set_signal)==SIG_ERR) { printf("set signal error"); } printf("main start\n"); user_call(); printf("mian end\n"); }
不可重入函数:
使用了全局变量或者静态变量
可重入函数:
全部内部变量