Linux下父程序向子程序傳送訊號

2022-02-12 23:26:50 字數 2361 閱讀 1971

需要用到的函式:

kill( )

int kill(pid,sig)

int pid,sig;

其中,pid是乙個或一組程序的識別符號,引數sig是要傳送的軟中斷訊號。

(1)pid>0時,核心將訊號傳送給程序pid。

(2)pid=0時,核心將訊號傳送給與傳送程序同組的所有程序。

(3)pid=-1時,核心將訊號傳送給所有使用者識別符號真正等於傳送程序的有效使用者標識號的程序。

signal( )

signal(sig,function)

signal(sig,function)

int sig;

void (*func) ( )

sig是乙個訊號量,而function是乙個函式名字,當使用signal接收到訊號時,會呼叫一次引數中的function方法。

訊號集設定與訊號遮蔽

檔案頭仍然是#include

宣告訊號集

sigset_t sigs;

清空訊號集

sigemptyset(&sigs);

新增訊號到訊號集

sigaddset(&sigs,sigint);

sigaddset第乙個引數為訊號集位址,第二個引數為訊號名,如sigint是ctrl+c的中斷訊號,也可以是其他的自定義訊號

遮蔽訊號集sigs中的所有訊號

sigprocmask( sig_block,&sigs,0);

這裡的sig_block代表的功能是將sigs訊號集加入到程序遮蔽中,第三個引數0是用來指向訊號集的指標。

sig_block //加入訊號到程序遮蔽。

sig_unblock //從程序遮蔽裡將訊號刪除。

sig_setmask //將set的值設定為新的程序遮蔽。

父程序向子程序傳送訊號,在按ctrl+c使父程序退出時子程序遮蔽^c訊號,父程序等待子程序執行完後自行退出。

#include #include #include #include void waiting( ),stop( );

int wait_mark;

int main( ) else

} else

return 0;

}void waiting( )

void stop( )

執行結果

程式建立兩個子程序,用無名管道和有名管道兩種方式實現父程序與子程序的資料通訊。第乙個子程序向管道寫入「i am child 1」,第二個子程序向管道寫入「i am child 2」。父程序從管道中讀取兩個子程序寫入的資料並列印。要求先列印「i am child 1」,後列印「i am child 2」。

方法一:使用乙個訊號,當pid1執行完了以後通知以下pid2

方法二:直接在pid2加個sleep

無名管道實現

#include #include #include #include int pid1,pid2;

void waiting( ),stop( );

int wait_mark;

main( ) else else }}

void waiting( )

void stop( )

執行結果

有名管道實現

#include #include #include #include #include #include int pid1,pid2;

void waiting( ),stop( );

int wait_mark;

int main( )

//o_rdwr:以讀寫的方式開啟

int fd = open(filename,o_rdwr);

if(fd < 0)

while ((pid1=fork( ))==-1);

if(pid1==0) else else ;

len = read(fd,buf,sizeof(buf) - 1);

printf("%s\n",buf);

//增加乙個傳送訊號

kill(pid2,10);

wait(0);

//父程序讀取pid2寫的檔案

len = read(fd,buf,sizeof(buf) - 1);

printf("%s\n",buf);

//銷毀檔案指標並刪除檔案

close(fd);

unlink(filename);

exit(0);

} }return 0;

}void waiting( )

void stop( )

執行結果

父程序與子程序管道

int main else return 0 先在父程序中建立管道,然後建立子程序,子程序複製了父程序管道檔案的檔案描述符,所以父程序和子程序各具有2個管道描述符,當在子程序中關閉讀端,這時關閉的是子程序中管道檔案的讀端,而父程序的讀端沒有關閉,這時子程序往寫段寫資料的時候,因管道讀端未完全關閉,所...

子程序父程序檔案共享

父子程序全域性變數不共享 寫時複製,讀時共享 檔案父子共享,而且關閉時父子程序都要close fd 我的理解是 雖然fork前的 只執行一次,但是建立子程序時複製使用者空間,此時檔案的狀態一同複製了 驗證父子程序,檔案共享 int main int argc,char ar else if pid ...

Linux 程序 父程序 子程序

程序和程式的區別 一 程序是動態的,程式是靜態的 程式是有序 的集合,程序是程式的執行。程序有核心態 使用者態。二 程序是暫時的,程式是永久的 程序是乙個狀態變化的過程,程式可以長久儲存 三 程序和程式的組成不同,程序的組成包括程式 資料和程序控制塊 即程序狀態資訊 什麼是程序識別符號什麼是父程序和...