需要用signal()函式捕捉中斷信號,然后父行程呼叫kill,向兩個子行程,使其輸出資訊后終止.
我將signal()函式位置改變,一個在行程創建前,一個在父行程創建后,都是希望通過中斷信號實作父行程和子行程的通信.
但是卻出現了不同的輸出資訊,一個有子行程輸出,一個沒有子行程輸出,想請問造成這樣的原因是什么?
這個代碼 直接在行程創建前就設定signal()函式,捕捉中斷信號.可以成功讓兩個子行程輸出資訊.
pid_t pid1,pid2;
signal(2,stop);
pid1=fork();
我做了少許調整.將signal()放到了呼叫的父行程中,結果輸入中斷信號,但是子行程并沒有輸出資訊.
pid_t pid1,pid2;
pid1=fork();
if(pid1>0){
pid2=fork();
if(pid2>0){
signal(2,stop);
printf("在父行程中\n");
sleep(10);
kill(pid1,16);
wait(0);
kill(pid2,17);
wait(0);
printf("\nParent process is killed!\n");
sleep(100);
exit(0);
以下是成功輸出子行程資訊的完整代碼.
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sched.h>
#include <signal.h>
#include <sys/wait.h>
#include <stdlib.h>
int wait_flag=1;
void stop(){
}
void stop2(){
wait_flag = 0;
}
int main(){
pid_t pid1,pid2;
signal(2,stop);
pid1=fork();
if(pid1>0){
pid2=fork();
if(pid2>0){
printf("在父行程中\n");
sleep(10);
kill(pid1,16);
wait(0);
kill(pid2,17);
wait(0);
printf("\nParent process is killed!\n");
exit(0);
}else{
signal(17,stop2);
while(wait_flag)
;
printf("在第二個子行程中:");
printf("Child Processl2 is killed by parent!\n");
exit(0);
}
}else if(pid1==0){
signal(16,stop2);
while(wait_flag)
;
printf("在第一個子行程中:");
printf("Child Processl1 is killed by parent!\n");
exit(0);
}
}
uj5u.com熱心網友回復:
你fork的時候子行程就已經創建了,所以你設定的信號量也是給子行程設定的。轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/117496.html
標籤:應用程序開發區
上一篇:shell expect settimeout超時問題
下一篇:配置Samba服務
