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)

  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/12908822.html
Copyright © 2011-2022 走看看