一、siginfo_t結構體簡介
siginfo_t是一個結構體,具有非常重要的作用。當發生信號的時候,內核會將有關信號的信息存儲在siginfo_t結構體中,然後傳遞給信號處理程序。siginfo_t結構體通常作為函數參數傳遞給信號處理程序,以提供關於信號的信息。
siginfo_t結構體位於包含在信號頭文件中,並在定義的基礎上。該結構體包含有關信號發生的信息,例如發出信號的進程的PID,特定事件的可能的內部狀態等。
二、siginfo_t結構體成員變量
siginfo_t結構體的成員變量分別如下:
• int si_signo:信號編號,表示信號的類型
• int si_errno:如果si_code是SIGFPE的話,那麼si_errno指示初始設定的浮點異常類型。否則,它就是0
• int si_code:si_code指出了異步事件的類型,它能夠使用SI_KERNEL、SI_USER或從SIGRTMIN到SIGRTMAX之間的一個整數。如果si_code為0,表示內核產生的信號
• pid_t si_pid:進程的ID,該進程發送了該信號
• uid_t si_uid:執行進程的真實用戶ID(uid)
• int si_status:與si_code相關的狀態值
• clock_t si_utime:在發送進程中累計的用戶模式運行時間
• clock_t si_stime:在發送進程中累計的內核模式運行時間
• sigval_t si_value:信號的值
• int si_int:整數等於si_value
• void *si_ptr:指針等於si_value
• int si_overrun:未處理時鐘過早觸發
• int si_timerid:計時器ID,產生si_code的計時器的ID
• int si_int:未知
• void *si_addr:有關硬件異常的附加地址
• int si_band:有關IO事件的附加事件碼
• int si_fd:與IO事件相關的文件描述符
三、siginfo_t結構體使用示例
#include #include #include static void sig_info_handler(int signum, siginfo_t *siginfo, void *data) { printf("Signal %d received with code %d, pid %d, and uid %d\n", signum, siginfo->si_code, siginfo->si_pid, siginfo->si_uid); exit(EXIT_SUCCESS); } int main() { struct sigaction act; act.sa_sigaction = sig_info_handler; act.sa_flags = SA_SIGINFO; if ((sigaction(SIGINT, &act, NULL) != 0)) { fprintf(stderr, "Failed to install signal handler!\n"); return 1; } printf("Waiting for signal...\n"); pause(); }
四、siginfo_t結構體應用實例
siginfo_t結構體非常有用,可以在進程之間傳遞信號。例如,當系統管理員需要重啟系統時,通常會發送SIGTERM信號給所有進程,讓它們退出。系統管理員可以編寫一個輔助程序,該程序使用kill()函數和siginfo_t結構體向所有進程發送SIGTERM信號,並記錄哪些進程成功退出,哪些沒有。
總之,siginfo_t結構體是Linux中非常重要的一個結構體,在信號處理、異常處理等方面有着廣泛的應用和產生重要的作用。
原創文章,作者:YTENB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/369227.html