C語言實現(xiàn)父進程主動終止子進程的方法總結(jié)
1.如子進程是循環(huán)狀態(tài)
子進程循環(huán)等待鍵盤的輸入,如父進程模擬鍵盤輸入一個字符,子進程收到就跳出scanf()。同理,如是socket 的accept()等待,也可以發(fā)送一字符,讓子進程跳出等待。
#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字符,子進程退出
puts("zjc over");
return 0;
}
printf("zjc:%s\n",c);
}
}
sleep(10); //10秒后,中止子進程的運行。
int fd = open("/dev/input/event3",O_RDWR); //每個機器的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.上面的方法不通用,可以說是特例,下面的方法采用kill()函數(shù),可以說是通用方法,采用管道先把子進程號傳到父進程,再用kill函數(shù)。此方法非常暴力,直接殺死子進程,不管它是否結(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()語句前
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); //父進程取得子進程號
printf("f:%d\n",bz);
kill(bz,1); //關(guān)閉子進程
// wait(&stat);
return 0;
}3. 父進程用sigqueue() 發(fā)送終止信號,子進程signal() 收到父進程信號,改變循環(huán)標(biāo)志位,退出循環(huán),再退出子進程。此種方法文明不粗暴。此處父進程不能用raise函數(shù),因為此函數(shù)只能向本進程發(fā)送信號。
#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可以為非子進程的不關(guān)聯(lián)進程發(fā)信號,只要知道對方的進程號就行了,可以用有名管道把進程號先傳給對方進程。突然想到,可不可以用這個發(fā)信號的方法來執(zhí)行進程間的互斥等操作。多進程主要用于多任務(wù),比如需要同時運行兩個以上執(zhí)行動作的場景。
對于被安裝信號的進程來講,進程內(nèi)代碼執(zhí)行與信號觸發(fā)是異步的。信號好象是硬件的中斷。條件產(chǎn)生了,操作系統(tǒng)就觸發(fā)信號,執(zhí)行信號的默認函數(shù)動作。執(zhí)行完后,又繼續(xù)執(zhí)行進程的代碼。
信號可以安裝在一個進程內(nèi),再由本進程觸發(fā)完成動作,如定時。
這個信號感覺非常有用,感覺這才是真正的多任務(wù),進程間可以互不影響,一個進程完成某個動作后,觸發(fā)信號通知另一個進程,(在觸發(fā)信號之前,另一個進程可以干別的事情)。告訴它,我已完成,你可以怎么辦。
以上就是C語言實現(xiàn)父進程主動終止子進程的方法總結(jié)的詳細內(nèi)容,更多關(guān)于C語言父進程終止子進程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++ STL set_difference set_intersection set_union 操作
這篇文章主要介紹了c++ STL set_difference set_intersection set_union 操作,需要的朋友可以參考下2017-03-03
C++中靜態(tài)成員函數(shù)訪問非靜態(tài)成員的實例
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)訪問非靜態(tài)成員的實例的相關(guān)資料,需要的朋友可以參考下2017-07-07

