最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言實(shí)現(xiàn)父進(jìn)程主動(dòng)終止子進(jìn)程的方法總結(jié)

 更新時(shí)間:2023年10月16日 09:17:10   作者:java 樂(lè)山  
一般的情況,子進(jìn)程自己運(yùn)行完后,執(zhí)行exit 或者return 后,父進(jìn)程wait.  waitpid收回子進(jìn)程,但子進(jìn)程是一個(gè)循環(huán)等待狀態(tài)不主動(dòng)退出,父進(jìn)程可以采用文中介紹的幾種方法,需要的朋友可以參考下

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)感覺(jué)非常有用,感覺(jué)這才是真正的多任務(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++中的兩種getline用法詳解

    c++中的兩種getline用法詳解

    c++中有2種getline函數(shù),一種在頭文件 <istream> 中,是istream類的成員函數(shù);另一種是在頭文件 <string> 中,是普通函數(shù)。這篇文章主要介紹了c++中的兩種getline用法,需要的朋友可以參考下
    2020-02-02
  • C++實(shí)現(xiàn)圖書館系統(tǒng)

    C++實(shí)現(xiàn)圖書館系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書館系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++之STL--string的使用

    C++之STL--string的使用

    這篇文章主要介紹了C++之STL--string的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Linux?C/C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具

    Linux?C/C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具

    網(wǎng)絡(luò)流量分析的原理基于對(duì)數(shù)據(jù)包的捕獲、解析和統(tǒng)計(jì)分析,通過(guò)對(duì)網(wǎng)絡(luò)流量的細(xì)致觀察和分析,幫助管理員了解和優(yōu)化網(wǎng)絡(luò)的性能,本文將通過(guò)C++實(shí)現(xiàn)網(wǎng)絡(luò)流量分析工具,有需要的可以參考下
    2023-10-10
  • 基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總

    基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總

    這篇文章主要介紹了基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法,非常經(jīng)典,需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言實(shí)現(xiàn)通訊錄的示例代碼

    C語(yǔ)言實(shí)現(xiàn)通訊錄的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何錄音C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C++中對(duì)象與類的詳解及其作用介紹

    C++中對(duì)象與類的詳解及其作用介紹

    這篇文章主要介紹了C++中對(duì)象與類的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語(yǔ)言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    C語(yǔ)言熱門考點(diǎn)結(jié)構(gòu)體與內(nèi)存對(duì)齊詳解

    在掌握基本的結(jié)構(gòu)體使用后,我們?cè)诿嬖嚭痛笮捅荣愔谐3?huì)遇到一個(gè)熱門考點(diǎn):結(jié)構(gòu)體內(nèi)存對(duì)齊,也就是計(jì)算結(jié)構(gòu)體大小。接下來(lái)請(qǐng)跟著筆者一起來(lái)學(xué)習(xí)這塊知識(shí)點(diǎn)吧
    2021-10-10
  • C語(yǔ)言 fscanf 和 fprintf函數(shù)示例詳解

    C語(yǔ)言 fscanf 和 fprintf函數(shù)示例詳解

    這篇文章主要介紹了 C語(yǔ)言 fscanf 和 fprintf函數(shù)示例詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • C語(yǔ)言技巧提升之回調(diào)函數(shù)的掌握

    C語(yǔ)言技巧提升之回調(diào)函數(shù)的掌握

    這篇文章主要為大家詳細(xì)介紹一下C語(yǔ)言中回調(diào)函數(shù)的用法教程,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-12-12

最新評(píng)論

巍山| 靖远县| 宝鸡市| 清新县| 桑日县| 阿克苏市| 图片| 巨鹿县| 台北县| 石棉县| 自贡市| 鹿邑县| 南汇区| 和田县| 绥宁县| 淳安县| 吉木乃县| 芦山县| 瑞昌市| 阿拉善左旗| 大兴区| 日喀则市| 洪湖市| 太仆寺旗| 腾冲县| 龙井市| 伊宁市| 嘉祥县| 七台河市| 军事| 东山县| 雷山县| 阜城县| 衡南县| 乌鲁木齐县| 平度市| 浮山县| 彭州市| 榆林市| 如皋市| 灵宝市|