實驗前置知識:
訊號處理函式:
(1)訊號安裝函式
signal()函式示例:
#include"signal.h"/使用兩個函式都必須包含這個標頭檔案
#include"unistd.h"
#include"stdio.h"
//訊號處理函式,呼叫時引數dunno會得到訊號的值
void sigroutine(int dunno)
return;
} int main()
//kill -9 31658 可以終止程序
操作結果:
sigaction()函式示例:
#include"signal.h"//使用兩個函式都必須包含這個標頭檔案
#define prompt"你想終止程式嗎"
char *prompt=prompt;
void ctrl_c_op(int signo)
/* int sigaction(int signum,const struct sigaction *act.struct sigaction *oact);
struct sigaction
*/ int main()
while(1);
}
(2)訊號傳送函式
必須包含的標頭檔案
#include
#include
kill()函式:
int kill(pid_t pid,int sig);
若pid>0,訊號sig傳送給程序號為pid的程序
若pid=0,訊號sig傳送給當前程序所屬的程序組裡的所有程序
若pid=-1,訊號sig傳送給除了號程序和自身以外的所有程序
若pid
若sig=0,將不傳送訊號
返回值為0時,函式執行成功
返回值為-1時,錯誤 錯誤**error
error=einval,訊號sig無效
error=srch,pid指定的程序不存在
error=eperm,許可權不足
raise()函式:
用於向自身傳送訊號
int raise(sint sig);
raise(signo)=kill(getpid(),signo)
alarm()函式:
用於設定乙個定時器,時間到則傳送sigalrm訊號給程序
unsigned int alarm(unsigned int seconds);
setitimer()函式:
定時器pause()函式:
是當前程序暫停進入睡眠狀態,直到被訊號所中斷
int pausee(void)
(3)訊號操作函式
int sigemptyset(sigset_t *set);
初始化訊號量集合set,將set設定為空
int sigfillset(sigset_t *set);
初始化訊號量集合,將訊號量集合設定為所有訊號的集合
int sigfaddset(sigset_t *set,int signo);
將訊號signo加入到訊號集合之中
int sigdelset(sigset_t *set,int signo);
將訊號從訊號集合中刪除
int sigmember(sigset_t *set,int signo);
查詢訊號是否在訊號集合中
最關鍵訊號
int sigprocmask(int how,const sigset_t *set,sigset_t *oset);
先設定號訊號集合set,將指定的訊號集合set加入到程序的訊號阻塞集合中去
實驗題目:訊號通訊
實驗目的:本實驗的目的主要是使學生理解訊號概念、掌握訊號通訊機制及藉此實現linux程序間通訊的原理。
實驗要求:利用訊號通訊機制在父子程序及兄弟程序間進行通訊。
實驗內容:
源程式:
#include"unistd.h"
#include"sys/types.h"
#include"signal.h"
#include"wait.h"
void sigchild_handler(int sig)
return;
}int main()
}
執行流程:
[2016236153@localhost ~]$ vi barrage.c
[2016236153@localhost ~]$ gcc -o barrage barrage.c
[2016236153@localhost ~]$ ./barrage
child process pid19408!
child:19408died:0
hi,parent process received sighld signal successfully!
[2016236153@localhost ~]$
源程式:
#include"signal.h"
#include"stdlib.h"
void sigint_handler(int sig)
void main()else if(pc>0)else if(pc<0)
}
執行流程:
[2016236153@localhost ~]$ vi unbarrage.c
[2016236153@localhost ~]$ gcc -o unbarrage unbarrage.c
[2016236153@localhost ~]$ ./
aa* barrage1* dsl/ memos/ unbarrage*
b* barrage2* hello* q*
barrage* dengshenglin/ lab8* sigmaltest*
[2016236153@localhost ~]$ ./unbarrage
this is child process pid 19108
this is child process pid first sleep 19108
this is child process pid second sleep 19108
^creceived sigint signal successed!
[2016236153@localhost ~]$ bg
bg: no current job.
執行結果:
Linux作業系統 訊號
1 訊號 乙個很短的訊息,可以被傳送到乙個或一組程序,通常是乙個數,以此來標識訊號。2 1 31編碼了常規訊號 不排隊,連續傳送多次,只有乙個有效 32 64編碼了實時訊號 必須排隊,以便接受多個訊號 3 訊號 隨時被傳送給乙個狀態不可預知的程序,傳送給非執行程序必須有核心儲存,直到程序恢復執行。阻...
作業系統訊號
在 posix 相容的平台上,sigkill 是傳送給乙個 程序來導致它立即終止的訊號。sigkill 的符號常量 在標頭檔案 signal.h 中定義。因為在不同平台上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,sigkill 是訊號 9。當sigkill 被傳送給乙個程式時...
作業系統 訊號(2)
作業系統中,訊號的產生可以告訴系統要去執行某個操作。作業系統中有預設的訊號處理函式。我們也可以更改預設的訊號處理函式,由我們自己寫。訊號捕捉 我們先來看看訊號在核心中是怎樣的 訊號對於作業系統來說,分為3類 1.阻塞訊號 2.未決訊號 3.忽略 每個訊號都有兩個標誌位分別為阻塞 block 和未決 ...