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毫秒