簡體   English   中英

進程使用 sigint_handler 捕獲 SIGINT 信號

[英]process catch SIGINT signal using sigint_handler

我在CSAPP一書中做shell實驗室時遇到了這個問題,實驗室要求你用一些規范實現你自己的shell版本,其中一個是

鍵入 ctrl-c (ctrl-z) 應該會導致將 SIGINT (SIGTSTP) 信號發送到當前前台作業,以及該作業的任何后代(例如,它派生的任何子進程)。 如果沒有前台工作,那么信號應該沒有效果。

所以你應該完成一個名為 sigint_handler 的給定函數,它應該捕獲 SIGINT 信號並將其發送到前台作業。 下面是我在網上找到的一段代碼(代碼通過了正確性檢查)

void sigint_handler(int sig) 
{
    int olderrno = errno;
    pid_t pid = fgpid(jobs);
    if (pid != 0)
        kill(-pid, sig);
    errno = olderrno;
    return;
}

我不明白的是,如果 SIGINT 是使用 kill 發送的,那么前台作業的后代也會使用這個處理程序來捕獲 SIGINT 信號,對嗎? 所以這是對我的一種遞歸調用。那么這實際上是如何工作的? 謝謝你幫助我。

處理程序安裝在主 function

signal(SIGINT,  sigint_handler);   /* ctrl-c */

和 fgpid 返回當前前台作業的 PID,如果沒有這樣的作業,則返回 0

一旦子進程調用execve() ,子進程(通常是短暫的)初始地址空間將被釋放/釋放並替換為指定可執行映像的空間; 現在,孩子不再擁有對父母數據或文本的副本或訪問權限,例如信號處理程序。

現在考慮一個與控制終端(tty)關聯的進程組。 當用戶鍵入 CTRL-C(或 CTRL-\ 或 CTRL-Z)時,tty 驅動程序將信號發送到 1+ 進程作為關聯進程組的成員。 除非進程建立了不同的信號處置( signal()sigaction()或相關),否則傳遞信號的結果將是系統默認操作。

發布的代碼摘錄表明一個中繼事件:用戶鍵入 CTRL-C,tty 驅動程序向 shell 發布 SIGINT,shell 的處理程序尋找前台作業,調用帶有負pidkill()以向該進程的成員發布信號-團體。

有關相關信息,請參閱這些手冊頁:

man setpgrp
man tty_ioctl  (symbols: TIOCSCTTY, TIOCGPGRP, TIOCSPGRP)

alternates:
man tcgetpgrp tcsetpgrp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM