linux進程的軟中斷通信
要求
實現軟中斷通信的程序
使用系統調用fork()創建兩個子進程,再用系統調用signal()讓父進程捕捉鍵盤上發出的中斷信號(即按delete鍵),當父進程接收到這兩個軟中斷的某一個后,父進程用系統調用kill()向兩個子進程分別發出整數值為16和17軟中斷信號,子進程獲得對應軟中斷信號,然后分別輸出下列信息后終止:
Child process 1 is killed by parent !!
Child process 2 is killed by parent !!
父進程調用wait()函數等待兩個子進程終止后,輸入以下信息,結束進程執行:
Parent process is killed!!
多運行幾次編寫的程序,簡略分析出現不同結果的原因。
相關函數
- signal函數
signal(sig,function): 捕捉中斷信號sig后執行function規定的操作。
頭文件為:#include <signal.h>
參數定義:signal(sig,function)
int sig;
void (*func) ();
其中sig共有19個值
這里用到了3號,即相應鍵盤的停止信號,ctr+\
(也可能是ctrl + c
),和16,17號自定義信號
-
wait()函數
父進程處於阻塞狀態,等待子進程終止,其返回值為所等待子進程的進程號 -
exit()函數
進程自我終止,釋放所占資源,通知父進程可以刪除自己,此時它的狀態變為P_state= SZOMB,即僵死狀態.如果調用進程在執行exit時其父進程正在等待它的中止,則父進程可立即得到該子進程的ID號
流程圖
實現
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include<sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
int flag_wait=1;
void stop2()
{
flag_wait=0;
printf("\nson interruption\n");
}
void stop()
{
printf("\ninterruption\n");
}
int main()
{
pid_t pid1,pid2;
signal(3,stop);
while((pid1=fork())==-1);
if(pid1>0)
{
while((pid2=fork())==-1);
if(pid2>0)
{
sleep(5);
kill(pid1,16);
wait(0);
kill(pid2,17);
wait(0);
printf("\nParent process is killed\n");
exit(0);
}
else
{
signal(17,stop2);
while(flag_wait);
printf("\nchild process 2 is killed\n");
exit(0);
}
}
else
{
signal(16,stop2);
while(flag_wait);
printf("\nchild process 1 is killed\n");
exit(0);
}
return 0;
}
結果
運行后若按下停止鍵,則
或者5秒后自動執行