Linux作業系統 訊號通訊

2021-09-24 05:26:53 字數 3516 閱讀 9143

實驗前置知識:

訊號處理函式:

(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 和未決 ...