linux進程的軟中斷通信


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秒后自動執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM