作業系統——實驗三(程序間通信)
實驗目的
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

結果分析:程式中的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信号。