Linux 版 (精华区)
发信人: netiscpu (说不如做), 信区: Unix
标 题: Gcc的安装与使用 (10)
发信站: 紫 丁 香 (Sat May 16 21:01:43 1998), 转信
发信人: jacky (绞肉机), 信区: linux
标 题: Gcc的安装与使用10
发信站: 饮水思源站 (Fri May 15 16:42:26 1998) , 站内信件
当一支程式以Ctrl-Z中止(stop),然後再重新执行(restart)时--或者是其它可以产生Ctrl-C中
断(interruption)信号的情况,如子程序(child process)终结(termination)等--系统就会抱怨说
"interrupted system call"或是"write: unknown error",或者诸如此类的讯息.
4.3.8.2. 问题点:
POSIX的系统检查信号的次数,比起一些旧版的Unix是要多那麽一点.如果是Linux,可能就
会执行signal handlers了--
非同步地(asynchronously)(计时器的滴答声)
系统呼叫的传回值(on return from any system call)
在下列系统呼叫的执行期间: select(), pause(), connect(),accept(), read() on
terminals, sockets, pipes or files in /proc, write() on terminals, sockets, pipes or the line
printer, open() on FIFOs, PTYs or serial lines,ioctl() on terminals, fcntl() with
command F_SETLKW, wait4(), syslog(), any TCP or NFS operations.
就其它的作业系统而言,你需要的可能就是下面这些系统呼叫(system calls)了: creat(),
close(), getmsg(), putmsg(), msgrcv(), msgsnd(), recv(), send(), wait(), waitpid(),
wait3(), tcdrain(), sigpause(), semop() to this list.
在系统呼叫期间,若有一信号(那支程式本身应准备好handler因应了)产生,handler就会被
呼叫.当handler将控制权转移回系统呼叫时,它会侦测出它已经产生中断,而且传回值会立
刻设定成-1,errno设定成EINTR.程式并没有想到会发生这种事,所以就会bottles out了.
有两种修正的方法可以选择:
(1) 对每个你自行安装(install)的signal handler,都须在sigaction旗号加上SA_RESTART.例如,把
下列的程式,
signal (sig_nr, my_signal_handler);
改成,
signal (sig_nr, my_signal_handler);
{ struct sigaction sa;
sigaction (sig_nr, (struct sigaction *)0, &sa);
#ifdef SA_RESTART
sa.sa_flags |= SA_RESTART;
#endif
#ifdef SA_INTERRUPT
sa.sa_flags &= ~ SA_INTERRUPT;
#endif
sigaction (sig_nr, &sa, (struct sigaction *)0);
}
要注意的是,当这部份的变更大量应用到系统呼叫之後,呼叫read(), write(),ioctl(),
select(), pause() 与 connect()时,你仍然得自行检查(check for)EINTR.如下所示.
(2) 你自己得很明确地(explicitly)检查EINTR:
这里有两个针对read()与ioctl()的例子.
--
m;33m※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.112.26.100]m
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.146毫秒