LINUX C 父程式建立多個子程式迴圈非堵塞回收列子
下面 程式碼主要用於複習,留於此
輸出如下可以捕獲子執行緒由於kill 發訊號終止:
▽aopeng@bogon:~/linux0411/process$ ./a.out
CHILD: I is child process pid: 2588 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2588
CHILD: I is child process pid: 2589 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2589
CHILD: I is child process pid: 2590 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2590
child process is pid:2588
child process is pid:2589
child process is pid:2590
parent pid 2587 fock child process number is 3 finsh!!
child 2588 cancel signal 9
child 2589 cancel signal 15
child 2590 cancel signal 11
可以捕獲正常終止
gaopeng@bogon:~/linux0411/process$ ./a.out
CHILD: I is child process pid: 2597 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2597
CHILD: I is child process pid: 2598 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2598
CHILD: I is child process pid: 2599 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2599
child process is pid:2597
child process is pid:2598
child process is pid:2599
parent pid 2596 fock child process number is 3 finsh!!
child 2599 cancel signal 1
child 2597 exit 1
child 2598 exit 1
點選(此處)摺疊或開啟
-
/*************************************************************************
-
> File Name: fork5.c
-
> Author: gaopeng QQ:22389860 all right reserved
-
> Mail: gaopp_200217@163.com
-
> Created Time: Sun 02 Jul 2017 02:39:16 AM CST
-
************************************************************************/
-
-
#include<stdio.h>
-
#include<unistd.h>
-
#include <stdlib.h>
-
#define MAXPNUM 3
-
-
typedef struct handler
-
{
-
int* pidarr;
-
int childnum;
-
} HANDLER;
-
-
int main(void)
-
{
-
int i = 0;
-
int m = 0;
-
int psre = 0;
-
HANDLER pidhd;
-
-
pidhd.pidarr = (int*)calloc(MAXPNUM+1,sizeof(int));//初始化記憶體
-
pidhd.childnum = 0;//初始化程式數量
-
-
-
-
for(i = 0 ;i<MAXPNUM;i++)//迴圈建立
-
{
-
m = fork();
-
if(m == -1)
-
{
-
perror("fork:");
-
}
-
else if( m == 0 )
-
{
-
printf("CHILD: I is child process pid: %d parent process pid: %d \n",getpid(),getppid());
-
sleep(60);
-
break;
-
}
-
else
-
{
-
sleep(1);
-
pidhd.childnum ++;//程式num+1
-
*(pidhd.pidarr+i) = m;//指標移動+1
-
printf("PARENT: I is parent process pid: %d i fock chlid pid: %d \n",getpid(),m);
-
}
-
}
-
-
if(i == MAXPNUM)//一定為父程式
-
{
-
for(i=0;*(pidhd.pidarr+i);i++)
-
{
-
printf("child process is pid:%d\n",*(pidhd.pidarr+i));
-
}
-
}
-
-
if(i == MAXPNUM)//一定為父程式
-
{
-
printf("parent pid %d fock child process number is %d finsh!! \n",getpid(),pidhd.childnum);
-
while(pidhd.childnum > 0)
-
{
-
for(i = 0;i< MAXPNUM ;i++) //WNOHANG非堵塞迴圈回收
-
{
-
if(*(pidhd.pidarr+i) != 0 && waitpid(*(pidhd.pidarr+i),&psre,WNOHANG) > 0 )
-
{
-
if (WIFEXITED(psre))//是否正常退出獲取其退出值
-
printf("child %d exit %d\n", *(pidhd.pidarr+i), WEXITSTATUS(psre));
-
else if (WIFSIGNALED(psre))//是否異常退出訊號終止獲得訊號值
-
printf("child %d cancel signal %d\n", *(pidhd.pidarr+i), WTERMSIG(psre));
-
*(pidhd.pidarr+i) == 0;
-
pidhd.childnum--;
-
break;
-
}
-
}
-
}
-
free(pidhd.pidarr);
-
}
-
return 1;//子程式父程式均已return 1 退出
- }
▽aopeng@bogon:~/linux0411/process$ ./a.out
CHILD: I is child process pid: 2588 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2588
CHILD: I is child process pid: 2589 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2589
CHILD: I is child process pid: 2590 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2590
child process is pid:2588
child process is pid:2589
child process is pid:2590
parent pid 2587 fock child process number is 3 finsh!!
child 2588 cancel signal 9
child 2589 cancel signal 15
child 2590 cancel signal 11
可以捕獲正常終止
gaopeng@bogon:~/linux0411/process$ ./a.out
CHILD: I is child process pid: 2597 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2597
CHILD: I is child process pid: 2598 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2598
CHILD: I is child process pid: 2599 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2599
child process is pid:2597
child process is pid:2598
child process is pid:2599
parent pid 2596 fock child process number is 3 finsh!!
child 2599 cancel signal 1
child 2597 exit 1
child 2598 exit 1
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2140651/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux系統程式設計 - 07. 迴圈建立N個子程式分析Linux程式設計
- 使用 Python 迴圈建立多個列表Python
- Linux socke server程式設計:父程式和子程式關係LinuxServer程式設計
- fork、父程式和子程式
- linux 子程式可以繼承父程式正在監聽的埠嗎? 如何子程式關閉了繼承的埠,父程式還能使用這個埠嗎?Linux繼承
- C# 迴圈時,操作另外一個程式直到操作完成,迴圈繼續執行C#
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- C語言程式設計學習中while迴圈和do……while迴圈C語言程式設計While
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 接上節我們來了解了解多程式的一些基礎程式 / 執行緒 / 多程式 / 父程式 / 子程式 / 會話 / 控制終端等執行緒會話
- 迴圈結構程式設計程式設計
- Linux下C語言驗證多程式LinuxC語言
- 非同步程式設計 101:寫一個事件迴圈非同步程式設計事件
- 11C++迴圈結構-for迴圈(1)C++
- Linux C++ 多執行緒程式設計LinuxC++執行緒程式設計
- 程式流程 (順序,選擇,迴圈)
- 程式碼日數:高階迴圈
- Linux——程式建立、程式終止、程式等待、程式程式替換Linux
- 畫江湖之 PHP 多程式開發 [建立一個新的程式]PHP
- 畫江湖之 PHP 多程式開發 【建立一個新的程式】PHP
- Idea 建立 父專案和子專案Idea
- [iOS]C語言技術視訊-06-程式迴圈結構(for{})iOSC語言
- Java 中建立子類物件會建立父類物件麼?Java物件
- VUE父傳子,子傳父Vue
- 子承父業-C#繼承C#繼承
- Python 中子程式與父程式Python
- 如何優雅地改善程式中for迴圈
- 替代 for 迴圈,讓 Python 程式碼更 pythonic !Python
- 怎樣用 Bash 程式設計:迴圈程式設計
- 3.迴圈結構程式設計程式設計
- Linux中建立程式常用的三個命令詳解!Linux
- Linux C/C++程式設計中的多執行緒程式設計基本概念LinuxC++程式設計執行緒
- 瞭解下C# 迴圈C#
- 微信小程式 swiper 迴圈遍歷N個資料內容微信小程式
- 一個註解@Recover搞定醜陋的迴圈重試程式碼
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- SQL Server2008程式堵塞處理方法SQLServer
- iOS 同一個workspace下建立多個專案程式設計iOS程式設計
- 五大演算法程式碼模板(DFS 遞迴非遞迴都算上,是六個)演算法遞迴