zoukankan      html  css  js  c++  java
  • SIGPIPE,SIGTTIN,SIGTTOU三个信号量的解读

    SIGPIPE

    TCP是全双工的信道,可以看作两条单工信道,TCP连接的两个端点各负责一条。当对端调用close,虽然本意是关闭整个两条信道,但本端只是收到FIN包。按照TCP协议的语义,表示对端只是关闭了其所负责的那一条单工信道,任然可以继续接收数据。也就是说,因为TCP协议的限制,一个端点无法获知对端的socket是调用了close还是shutdown。

    例子:A和B使用TCP传输文件。现在B调用close,清空自己的接收缓存,A 往 B write(发送)数据。

    如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭。但第一次对其调用write方法时,如果 A 发送数据到 B 的缓存没问题,会返回正确写入,但 A 发送的报文会导致B发送RST报文,因为 B 的socket已经调用了close,完全关闭,既不发送,也不接收数据。所以 A 第二次调用write方法(假设在收到 RST 报文之后),会生成 SIGPIPE 信号,导致进程退出。

    为了避免进程退出,可以捕获 SIGPIPE 信号,或者忽略它,给他设置 SIG_IGN 信号处理函数。

    signal(SIGPIPE, SIG_IGN);

    SIGTTIN/SIGTTOU

    unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发 SIGTTIN(读) 和 SIGTTOU(写)信号量,接着,进程将会暂停(linux默认),read/write将会返回错误。

    这时,shell将会提醒用户切换此进程为前台进程,以便继续执行。后台切换至前台的命令。

    fg

    前台转为后台则为 CTRL+Z 快捷键

    那么如何才能不把进程切换至前台的情况下,读写控制器不会被暂停? 答案:只要忽略 SIGTTIN 和 SIGTTOU 信号量即可

    signal(SIGTTIN, SIG_IGN);
    signal(SIGTTOU, SIG_IGN);

    SIGINT

    终止进程。程序终止(interrupt)信号,通常用户使用 Ctrl + C 发出进程终止信号

    SIGKILL

    终止进程     杀死进程

    SIGTERM

    程序结束(terminate)信号,软件终止信号。与SIGKILL不同的是该信号可以被阻塞和处理,通常用来要求程序自己正常退出

    SIGSEGV

    内存访问错误导致进程终止。(Segmentation fault)

  • 相关阅读:
    冲刺阶段(三)
    冲刺阶段(二)
    第十一周学习进度
    冲刺阶段(一)
    第十一周学习进度条
    第一阶段——站立会议总结DAY04
    第一阶段——站立会议总结DAY03
    第一阶段——站立会议总结DAY02
    第一阶段——站立会议总结DAY01
    第十周学习进度条
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/12908822.html
Copyright © 2011-2022 走看看