• Unix进程间通讯之信号


    产生信号的条件:

      按某些终端键时,如Delete,Ctrl+C等。

      硬件产生异常信号,除数为0,无效的内存引用等。

      Kill函数可以将任意信号发送给另一个进程或进程组。

      再控制台界面使用kill命令终止一个失控的后台进程。

      当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号,如管道的都进程已终止后,一个进程写进此管道

    相应的,再接收到信号时,可以采取以下三种措施:

      忽略信号,但是有些信号不能被忽略

      捕捉信号,通过使用signal为当前进程的某信号注册一个函数,在接收到信号时,执行对应函数

      执行默认动作,没有为信号指定应该如何处理时,使用该系统默认的方法处理信号。

    信号处理方面,待处理信号不会排队等待。即针对同一类型的信号,只能有一个待处理信号。例如,一个进程接受了一个SIGCHLD的信号,在执行SIGCHLD的信号处理程序的时候,来了两个SIGCHLD信号,那么只有一个SIGCHLD会成为待处理信号。

    SIGCHLD信号是在子进程状态改变后产生此信号, 父进程需要调用一个wait函数以检测发生了什么。

    函数kill和raise:

      kill有两个参数,第一个参数为pid_t,第二个参数为信号,其实kill的这个函数的名字并不准确,kill函数的功能和他的名字“杀死”并不符合,它的作用是向某一指定进程发送指定信号。

      假如pid_t为大于零,则发送给该进程,假如==0,发送给同进程组的所有进程。

      pid小于零,发送给进程组ID等于绝对值的所有进程。

      pid==-1,发送给全部进程。

      注意,kill只会向那些有kill有权限向他们发送信号的进程   发送信号。

      raise函数其实封装了一层kill 调用raise(signo)== kill(getpid(),signo);

    Alarm和Pause:

      alarm函数可以设置一个定时器,在某个时刻定时器会超时,当定时器超时,产生SIGALAR信号,如果忽略或不捕捉信号,默认动作是终止调用该alarm函数的进程。

      pause函数是进程鼓起直至捕捉到一个信号。

      使用alarm和pause可以实现sleep函数。这一部分后续添加。

  • 相关阅读:
    构造函数初始化与赋值
    C代码中如何调用C++ C++中如何调用C
    C用函数指针模拟重载 C++重载
    【2019.10.30】意料之外的小黄衫——获得小黄衫感言
    【2019.10.30】SDN上机第1次作业
    【2019.10.17】十天Web前端程序员体验(软件工程实践第五次作业)
    【2019.10.07】《重生之我是程序员》
    【2019.09.30】“福大同好”——原型设计展示~
    【2019.09.30】构建之法《四五八章读后感》
    【2019.09.25】《构建之法》前三章读后感
  • 原文地址:https://www.cnblogs.com/derek-dhw/p/11106861.html
Copyright © 2020-2023  润新知