Linux 信号

信号

信号是linux中进程间通信的一种方式,全称为软中断信号。它只是通知进程发生了某种事情,本身不传递任何其他信息。

  • 可靠信号与不可靠信号
    信号分为可靠信号与不可靠信号,可靠信号又称为实时信号,非可靠信号又称为非实时信号,信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号。
    不可靠信号的特点在于:

    1. 每次信号处理完之后,就会恢复成默认处理,如果希望后面可以再次捕捉信号,需要重新注册。
    2. 存在信号丢失的问题,进程收到的信号不作排队处理,相同的信号多次到来会合并为一个。

    造成这种情况的原因主要在于Unix对信号处理比较简单,linux继承了Unix的信号处理,不过在后面进行了优化,出现了可靠信号。

  • 信号产生

    1. 硬件方式:
      • 用户输入:比如用户输入ctrl+c,就发送了一个SIGINT信号给当前的进程
      • 硬件异常:CPU检测到内存非法访问等异常,通知内核生成相应信号,并发送给发生事件的进程。
    2. 软件方式:
      • 命令行输入kill,发送对应类型的信号给指定的进程
      • 进程调用系统调用,发送信号给其他进程
  • 信号处理
    在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。因此,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个,也就是不可靠信号的信号丢失。
    内 核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。
    内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时。所以,当一个进程在内核态下运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理。进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。
    需要注意的一些地方:
    1. 在一些系统中,当一个进程处理完中断信号返回用户态之前,内核清除用户区中设 定的对该信号的处理例程的地址,即下一次进程对该信号的处理方法又改为默认值,除非在下一次信号到来之前再次使用signal系统调用。这可能会使得进程 在调用signal之前又得到该信号而导致退出。在BSD中,内核不再清除该地址。但不清除该地址可能使得进程因为过多过快的得到某个信号而导致堆栈溢 出。为了避免出现上述情况。在BSD系统中,内核模拟了对硬件中断的处理方法,即在处理某个中断时,阻止接收新的该类中断。
    2. 如果要捕捉的信号发生于进程正在一个系统调用中时,并且该进程睡眠在可中断的优先级上,这时该信号引起进程作一次longjmp,跳出睡眠 状态,返回用户态并执行信号处理例程。当从信号处理例程返回时,进程就象从系统调用返回一样,但返回了一个错误代码,指出该次系统调用曾经被中断。这要注 意的是,BSD系统中内核可以自动地重新开始系统调用。
    3. 若进程睡眠在可中断的优先级上,则当它收到一个要忽略的信号时,该进程被唤醒,但不做longjmp,一般是继续睡眠。但用户感觉不到进程曾经被唤醒,而是象没有发生过该信号一样。
    4. 内核对子进程终止(SIGCLD)信号的处理方法与其他信号有所区别。当进程检查出收到了一个子进程终止的信号时,缺省情况下,该进程 就象没有收到该信号似的,如果父进程执行了系统调用wait,进程将从系统调用wait中醒来并返回wait调用,执行一系列wait调用的后续操作(找 出僵死的子进程,释放子进程的进程表项),然后从wait中返回。SIGCLD信号的作用是唤醒一个睡眠在可被中断优先级上的进程。如果该进程捕捉了这个 信号,就象普通信号处理一样转到处理例程。如果进程忽略该信号,那么系统调用wait的动作就有所不同,因为SIGCLD的作用仅仅是唤醒一个睡眠在可被 中断优先级上的进程,那么执行wait调用的父进程被唤醒继续执行wait调用的后续操作,然后等待其他的子进程。

程序后台运行

当终端断开的时候,会收到 HUP信号从而关闭其所有子进程,程序无法后台运行,也就是因为受到HUP信号的影响。因此,就有两种途径让程序可以后台运行:让进程忽略 HUP 信号;让进程运行成为不属于此终端的子进程。

  • nohup
    nohup 的使用是比较常见的,也是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
  • setsid
    setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid。这样新进程的父id就是init进程,而不是当前终端的进程 ID了。
  • ()&
    将命令放在()中,就可以让命令在子shell中运行而非当前shell。如果在()中再加上&,那么运行的命令的父进程就是init进程了。
  • disown
    如果我们在运行的时候忘记了使用上面的方法,但是又不想重启程序,那么这时候,就可以使用diown了。
    用disown -h jobspec来使某个作业忽略HUP信号。
    用disown -ah 来使所有的作业都忽略HUP信号。
    用disown -rh 来使正在运行的作业忽略HUP信号。
    需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
  • screen
    screen可以让用户在多个会话之间切换,也可以共享会话。
    使用screen创建的会话,父进程都是init进程。当前session断开就不会影响到对应的会话,而且其他session和可以登录到这个会话操作。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 进程之间可以通过信号传递信息,信号是一种软中断机制,通过信号用来通知进程发生了异步事件。进程之间可以互相通过系统调...
    lintong阅读 411评论 0 2
  • 对于 Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号,为 Linux 提供了一种处理异步事件...
    故事狗阅读 84,928评论 2 62
  • 理论部分 简单来说 信号是用来通知进程发生了异步事件 比如,在终端运行程序,按下ctrl+c就产生一个中端信号,大...
    捉虫大师阅读 1,745评论 0 2
  • 那些能用的…… 田野,是那些年孩子们的药箱和工具房。 七七毛(刺儿菜) 学名小蓟,ji,四声。我们叫它七七毛,象毛...
    翊M阅读 1,826评论 0 1
  • 此时凉风浓,它吹着我眼前的花叶,跳起了舞。今日,我极慵懒,若心有愁丝千根柳,珠帘摆,无风亦有风,却将这愁丝吹不走。...
    司才林阅读 251评论 4 13