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

linux signal 信号

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

    本文导语:  情景: 1、多个进程,每个进程中注册同一个信号,信号响应函数只做了一件事情: 让进程睡两秒 sleep(2)  2、每个进程中都有频繁的文件操作和网络通信 问题: 当某个进程给其他几个进程发送信号让其睡眠后,会不...

情景:
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楼是正确的

    
 
 

您可能感兴趣的文章:

  • 学习linux的新手问:linux进程信号掩码以及信号阻塞与信号未决怎么理解?
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • Linux下的信号忽略和信号阻塞是什么意思
  • 请高手指教 linux 信号处理问题
  • linux 信号中断
  • linux 信号 按什么键能发SIGCONT 信号??
  • linux的信号处理函数中如何访问共享资源
  • linux中 关于 进程和信号的问题
  • 如何使用命令行删除Linux下的POSIX有名信号灯
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • 关于linux内核中信号处理的问题?(信号处理的时间)
  • linux多线程信号问题
  • linux下面的信号都已经是"可靠信号"了吗,已经没有了不可靠信号?
  • linux 只有SIGUSR1和SIGUSR2,如果有多个应用程序需要信号,怎么办?
  • 在linux下怎么使用信号量?
  • 关于Linux下的信号量
  • Linux,aix,windows下可以查询非本进程的信号处理函数吗?
  • linux 下信号机制问题
  • 请问那些linux信号是不能捕捉的?
  • 关于Linux驱动中signal的使用
  • REDHAT LINUX 9中如何使用signal这个函数进行中断通信?
  • 关于linux下的signal函数的问题
  • linux 2.4.0中do_signal参数传递问题,请大牛来解答
  • install exit abnormally -- received signal 11(硬盘安装linux失败)
  • linux c 编程,signal函数的一个问题
  • linux中信号signal函数实例遇到的疑问
  • linux fork 和signal 的问题
  • 刚接触linux环境编程,关于signal()和pause()的问题,请教高手
  • Linux中用signal在进程间通讯,如何传指针啊?
  • Linux下C编程问题:段错误,Program received signal SIGSEGV, Segmentation fault.请教各位!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


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

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3