169it科技资讯
169it -->


当前位置:  技术问答>linux和unix

linux signal 信号

    来源: 互联网  发布时间:2017-01-12

情景:
1、多个进程,每个进程中注册同一个信号,信号响应函数只做了一件事情: 让进程睡两秒 sleep(2) 
2、每个进程中都有频繁的文件操作和网络通信
问题:
当某个进程给其他几个进程发送信号让其睡眠后,会不会导致睡眠的进程文件操作或网络通信出错,比如文件只写一半或者网络接收数据失败等问题

这个问题的背景是这样的,在程序中有临时使用root权限的时候,这段时间我想让其他进程停止工作,所以使用上述方法,有没有好的解决方法?

|
硬中断确实会中断系统调用的,signal 应该是软中断,软中断会不会中断系统调用呢?

signal会中断系统调用,比如常见的阻塞函数read/write/select。
通过man手册查看函数的错误代码,如果有EINTR,表示该函数会阻塞,而且会有信号中断的可能性。

比如进程A在read文件,想读取1M数据,阻塞时间为1S。
在这1S内,操作系统可能向A发出信号,例如SIGCHILD、SIGINT,
那么A调用的read将失败并返回-1 , errno为EINTR。
而且,A操作的文件会回复到read调用之前的状态,即文件指针偏移、内容等和read之前一样。
所以,即使出错了,也不用担心,因为操作系统会自动回滚。A只需要再read一次就可以了。

如果A调用read总是被中断怎么办?写一个while(1)不断读取就可。

int  interruptable_read( int  fd , void*  buf , int  count)
{
while(1)
{
    int  ret = read( fd , buf , count);
    if( (-1==ret) &&( EINTR==errno))
    {
        continue;
    }
    else
    {
        return  ret ;
     }
}
}

|
看APUE吧。

|
这个应该不会有什么问题吧,系统会考虑到中断服务程序对现有的进程的执行的影响。
保存变量,或者在可能造成影响的地方关中断。

|
不同的实现有不同的对待信号中断的方法
对于read:
一种是,read返回被中断时读到的数据;一种是,read返回-1,errno被设置为EINTR。
相应地,对于write:
一种是write返回写入的数据量;一种是返回-1,errno被设置为EINTR。

|
进行信号处理将会中断系统调用 errno被设置为EINTR 所以1楼5楼是正确的
本页相关标签:

    
相关技术文章:
    ▪加载混杂设备

     我在加载misc混杂设备的时候,发现板子上已经存在misc一个混杂设备,但又不知道是哪个设备模块加载的。我检查了drivers目录下的程序,发现有4个申请注册混杂设备。于是我用rmmod卸载了4个程序对应的驱动模块,但misc这个设备还是存在,我不知道到底是哪个设备加载的。怎样才能在已经存在某个不明混杂设备的情况下加载新的混杂设备?我急于求解,希望高手指点,感激涕零! | 到 /dev下ls -al 一下这个设备看看它的设备号 混杂设备的主设备号是相同的,只要次设备号不同,就可以直接加载的。 ......


    ▪求rm/rm -rf命令改写脚本

     本来心情不错,结果在敲命令的时候,手误 rm -rf file 几天心血就这么木有了,经抢救,无效....囧,linux下恢复文件的确不会,哎,两个钟头没搞出啥.... 这次摔了,认了,求改写脚本 网上有这么一个 mkdir -p ~/.trash alias rm=trash  alias r=trash  alias rl='ls ~/.trash' alias ur=undelfile undelfile() {     mv -i  ~/.trash/$@ ./ } trash() {     mv $@ ~/.trash/ } 这个的确可以用,问题是想清理 .trash里面文件咋弄,肯定不能再用rm的.... 求rm / rm -rf的命令改写脚本,吸取教训[其他命令的改写脚本也欢迎,例如删除分......


    ▪Curl和C-Ares

         各位大虾好,小菜遇到了一下问题,在此先谢谢了。     1、我使用Curl连接网站,希望可以异步获取信息,所以我想使用多线程,通过查找资料,在官方中有两种方式,一种是开启多线程,另一种是使用了类似于select机制的multi的方法,我还不清楚这两种方法的区别。     2、使Curl异步需要使用C-Ares来解决,但是,我不知道怎么样在编译的时候吧C-Ares编译到Curl中,我看了README.ares文件,并在http://blog.gmane.org/gmane.comp.web.curl.library/month=20100101网站中找到了一下代码: #include <curl/curl.h> int main() {  curl_version_info_data*info=curl_version_inf......


 
最新技术文章:
    ▪linux自动加载新硬盘

     我新加了一个硬盘!分区为:                    sdb1                    sdb2                    sdb5                    sdb6 我格式化了sdb5 文件系统为ext3;我mount /dev/sdb5 /sdb/   我在/etc/fstab添加如下:  /dev/sdb5       /sdb          ext3           defaults      1     4     可是我开机后在/sdb下并没有内容!mount一下也不见/dev/sdb5出现!这是为什么啊? 请大家帮帮忙!谢谢! |  /dev/sdb5 /sdb ext3 defaults 1 2 ......


    ▪SC36410下的fpga驱动

     各位前辈好!有个问题向大家请教,我现在S3C6410下开发与FPGA的接口驱动,还是个新手。 6410的xmoaddr[0:19]部分端口是与gpio端口复用的,在驱动的时候怎么对gpio控制器进行设置? 万分期待大家的回复!谢谢 | 不用配置gpio的,需要设置对应的memory的寄存器,其 address range from 0x1000_0000 to 0x17FF_FFFF stands for  Xm0CSn[0],然后直接使用映射物理地址就行了。就把FPGA当成一个外部存储器就行了。 | 额,这个就没有办法了啊,上面说的0x1000_0000 to 0x17FF_FFFF的前提建立在地址线最少27根上的。 |......


    ▪ubuntu关机的不断电源有什么作用

     ubuntu里面shutdown命令有个option是-H 我试了一行 它把系统关了 可是没有断电源 于是乎就纳闷 这样做到底有什么作用 百思不得其解 求解答 | 事实上,关机和断电是两码事…… 之所以LZ会有这样的误解,一方面是很多系统出于人性化考虑,关机=关机+断电,比如windows,mac以及linux的gui关机以后都会断电…… 另一方面是中文翻译的问题,关机=shutdown; 断电=powerdown或者poweroff…… 理论上的关机指的是关闭操作系统,而不是关闭主机,但是由于只关闭操作系统而不断电实在没什么意义,所以绝大多数操作系统都有关机后告诉硬件(可能......


 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号