天天看點

作業系統——實驗三(程序間通信)——3.3.1作業系統——實驗三(程序間通信)

作業系統——實驗三(程序間通信)

實驗目的

1、了解linux系統中程序通信的基本原理。

2、分析程序競争資源現象,學習解決程序互斥的方法。

3.3.1

通過Linux提供的系統調用signal()來說明如何執行一個預先安排好的信号處理函數。

第一步

建立c檔案夾,在它下面建立hello.c檔案

mkdir c
           
vim test.c
           

第二步

寫入參考程式

程式

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <signal.h>
int ctrl_c_count=0;
void (*old_handler)(int);
void ctrl_c(int);
void main()
{
int c;
/*設定ctrl+c産生的信号SIGINT的處理程式為ctrl_c.取代系統原來預設的處理程式*/
old_handler=signal(SIGINT,ctrl_c);
/*不斷輸入字元,同時按多次ctrl+c,直到按回車結束*/
while((c=getchar())!='\n');
printf("ctrl_c_count=%d\n",ctrl_c_count);
/*設定信号處理程式為原來的處理程式*/
(void)signal(SIGINT,old_handler);
/*不斷輸入字元,ctrl+c結束*/
while((c=getchar())!='\n');
}

/*對SIGINT信号的處理程式*/
void ctrl_c(int signum)
{
(void)signal(SIGINT,ctrl_c);
++ctrl_c_count;
}
           

第三步

編譯該檔案,生成test

gcc -o test test.c
           

第四步

運作該檔案記錄結果

./test
           
作業系統——實驗三(程式間通信)——3.3.1作業系統——實驗三(程式間通信)

結果分析:程式中的ctrl_c函數的功能是記錄SIGINT(CTRL+c)的次數,是以ctrl_c_count=8,當使用預設的函數操作時,CTRL+c退出程式

相關知識

signal(sig,function):

允許調用程序控制軟中斷信号的處理。

頭檔案為:

#include<signal.h>

參數定義:

signal(sig,function);

int sig;

void(*func)();

其中:sig的值是:

SIGHVP挂起

SIGINT鍵盤按^c鍵或break鍵

SIGQUIT鍵盤按quit鍵

SIGILL非法指令

SIGIOTIOT指令

SIGEMTEMT指令

SIGFPE浮點運算溢出

SIGKILL要求終止程序

SIGBUS總線錯

SIGSEGV段違例

SIGSYS系統調用參數錯

SIGPIPE向無讀者管道上寫

SIGALRM鬧鐘

SIGTERM軟體終結

SIGUSRI使用者定義信号

SIGUSR2第二個使用者定義信号

SIGCLD子程序死

SIGPWR電源故障

function的解釋如下:

SIG_DEL:預設操作。

對除SIGPWR和SIGCLD外所有信号的預設操作是程序終結對信号SIGQUIT,SIGILL,SIGTRA,SIGIOT,SIGEMT,SIGFPE,SIGBUS,SIGSEGV和SIGSYS它産生一記憶體映像檔案。

SIG_IGN:忽視該信号的出現。

Function:在該程序中的一個函數位址,在核心傳回使用者态時,它以軟中斷信号的序号作為參數調用該函數,對除了信号SIGILL,SIGTRAP和SIGTWR以外的信号,核心自動地重新設定軟中斷信号處理程式的值為SIG_DEL,一個程序不能捕獲SIGKILL信号。