C語(yǔ)言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)
1.如子進(jìn)程是循環(huán)狀態(tài)
子進(jìn)程循環(huán)等待鍵盤的輸入,如父進(jìn)程模擬鍵盤輸入一個(gè)字符,子進(jìn)程收到就跳出scanf()。同理,如是socket 的accept()等待,也可以發(fā)送一字符,讓子進(jìn)程跳出等待。
#include <string.h> #include <stdio.h> #include <fcntl.h> #include <linux/input.h> #include <linux/uinput.h> #include <stdio.h> #include <unistd.h> #include <wait.h> void mn_key(int fd,int kval) { struct input_event event; event.type = EV_KEY; event.value = 1; event.code = kval; write(fd,&event,sizeof(event)) ; event.type = EV_SYN; event.code = SYN_REPORT; event.value = 0; write(fd, &event, sizeof(event)); memset(&event, 0, sizeof(event)); event.type = EV_KEY; event.code = kval; event.value = 0; write(fd, &event, sizeof(event)); event.type = EV_SYN; event.code = SYN_REPORT; event.value = 0; write(fd, &event, sizeof(event)); } int main() { int stat; pid_t pid=fork(); if(pid==0){ while(1){ char c[20]; scanf("%s",c); if(!strcmp(c,"0")){ //接收到0字符,子進(jìn)程退出 puts("zjc over"); return 0; } printf("zjc:%s\n",c); } } sleep(10); //10秒后,中止子進(jìn)程的運(yùn)行。 int fd = open("/dev/input/event3",O_RDWR); //每個(gè)機(jī)器的event(n)可能不同。 if(fd<=0){ puts("keyboad error"); //dev/input/event3 權(quán)限chmod 777 要能讀寫 return -1; } mn_key(fd,KEY_0); mn_key(fd,KEY_ENTER); mn_key(fd,KEY_ENTER); //不清楚為什麼要兩行 wait(&stat); close(fd); }
2.上面的方法不通用,可以說(shuō)是特例,下面的方法采用kill()函數(shù),可以說(shuō)是通用方法,采用管道先把子進(jìn)程號(hào)傳到父進(jìn)程,再用kill函數(shù)。此方法非常暴力,直接殺死子進(jìn)程,不管它是否結(jié)束。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <wait.h> #include <signal.h> #include <sys/prctl.h> #include <sys/types.h> int main(void){ // int stat; int zf[2]; pipe(zf); //此句必須放在fork()語(yǔ)句前 pid_t pid=fork(); if(pid==0){ pid_t pid1=getpid(); printf("z:%d\n",pid1); write(zf[1],&pid1,4); while(1){ char c[10]; scanf("%s",c); if(!strcmp(c,"~")){ puts("zjc over"); exit(0); } printf("%s\n",c); } } sleep(3); pid_t bz; read(zf[0],&bz,4); //父進(jìn)程取得子進(jìn)程號(hào) printf("f:%d\n",bz); kill(bz,1); //關(guān)閉子進(jìn)程 // wait(&stat); return 0; }
3. 父進(jìn)程用sigqueue() 發(fā)送終止信號(hào),子進(jìn)程signal() 收到父進(jìn)程信號(hào),改變循環(huán)標(biāo)志位,退出循環(huán),再退出子進(jìn)程。此種方法文明不粗暴。此處父進(jìn)程不能用raise函數(shù),因?yàn)榇撕瘮?shù)只能向本進(jìn)程發(fā)送信號(hào)。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <wait.h> #include <sys/types.h> #include <signal.h> int main(void){ union sigval si; si.sival_int=0; int stat; pid_t zf[2]; pipe(zf); pid_t pid=fork(); if(pid==0){ pid_t id=getpid(); write(zf[1],&id,4); int t=1; void handle(int sig){ printf("%d\n",sig); t=0; } signal(20,&handle); while(t){ puts("zjc"); sleep(1); } printf("%d\n",t); //t=0 exit(0); } int bz; read(zf[0],&bz,4); sleep(2); sigqueue(bz,20,si); wait(&stat); return 0; }
sigqueue可以為非子進(jìn)程的不關(guān)聯(lián)進(jìn)程發(fā)信號(hào),只要知道對(duì)方的進(jìn)程號(hào)就行了,可以用有名管道把進(jìn)程號(hào)先傳給對(duì)方進(jìn)程。突然想到,可不可以用這個(gè)發(fā)信號(hào)的方法來(lái)執(zhí)行進(jìn)程間的互斥等操作。多進(jìn)程主要用于多任務(wù),比如需要同時(shí)運(yùn)行兩個(gè)以上執(zhí)行動(dòng)作的場(chǎng)景。
對(duì)于被安裝信號(hào)的進(jìn)程來(lái)講,進(jìn)程內(nèi)代碼執(zhí)行與信號(hào)觸發(fā)是異步的。信號(hào)好象是硬件的中斷。條件產(chǎn)生了,操作系統(tǒng)就觸發(fā)信號(hào),執(zhí)行信號(hào)的默認(rèn)函數(shù)動(dòng)作。執(zhí)行完后,又繼續(xù)執(zhí)行進(jìn)程的代碼。
信號(hào)可以安裝在一個(gè)進(jìn)程內(nèi),再由本進(jìn)程觸發(fā)完成動(dòng)作,如定時(shí)。
這個(gè)信號(hào)感覺非常有用,感覺這才是真正的多任務(wù),進(jìn)程間可以互不影響,一個(gè)進(jìn)程完成某個(gè)動(dòng)作后,觸發(fā)信號(hào)通知另一個(gè)進(jìn)程,(在觸發(fā)信號(hào)之前,另一個(gè)進(jìn)程可以干別的事情)。告訴它,我已完成,你可以怎么辦。
以上就是C語(yǔ)言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言父進(jìn)程終止子進(jìn)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++ STL set_difference set_intersection set_union 操作
這篇文章主要介紹了c++ STL set_difference set_intersection set_union 操作,需要的朋友可以參考下2017-03-03C語(yǔ)言運(yùn)算符優(yōu)先級(jí)列表(超詳細(xì))
本篇文章是對(duì)C語(yǔ)言中運(yùn)算符的優(yōu)先級(jí)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++中靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員的實(shí)例
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)訪問(wèn)非靜態(tài)成員的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07判斷一個(gè)數(shù)是不是素?cái)?shù)的方法
判斷一個(gè)數(shù)是不是素?cái)?shù)的方法,需要的朋友可以參考一下2013-03-03