我想到了有几个方案,大致如下:

一是用信号量,由于wait是阻塞函数,所以这里用waitpid,并且设置参数NOWHANG,这样waitpid就不是阻塞的了。

具体实现如下:

int main() {
int count=0;
int i;
pid_t pid;

signal(SIGCHLD, wait4children);

for(i=0; i<100; i++) {
pid = fork();
if(pid == 0){
count++;
break;
}
}

if(pid>0) {
printf("press Enter to exit...");
getchar();
}

return 0;
}

void func_waitpid(int signo) {
pid_t pid;
int stat;
while( (pid = waitpid(-1, &stat, WNOHANG)) > 0 )
{//如果使用了WNOHANG参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。
printf( "child %d exit\n", pid );
count--;
if(count==0)
{
break;
}
}
return;
}

还有一种实现,不调用wait,在父进程中设置条件,未满足条件的时候pause父进程。

int iChildCount = 0;

int ProcChildEnd(int iSigNo);

int main()
{
pid_t pid;
int i = 10;

signal(SIGCHLD, ProcChildEnd);

//take fork 10 child processes for example, you can fork any amount child processes as you want
while(i--)
{
pid = fork();
if (pid == 0)
{
//child;
}
else if (pid > 0)
{
iChildCount++;
}
else
{
//error;
}
}

//block untill all child process have been ended
while(iChildCount > 0)
{
pause();
}

//All child have been ended, start to do anything you want

return 0;
}

int ProcChildEnd(int signo)
{
iChildCount--;
return 0;
}


更多相关文章

  1. IO流在fork()的ed进程中
  2. jmap使用以及 linux下查看进程的内存使用情况
  3. Linux daemon进程的应用、实现和原理
  4. linux usb枚举过程分析之守护进程及其唤醒【转】
  5. 进程间通讯概述
  6. 转:——Windows和Linux进程间通信区别
  7. linux内核模块的强制删除-结束rmmod这类disk sleep进程
  8. linux进程和线程排查 · 记一次JVM CPU高负载的排查办法
  9. Linux内存占用分析 进程内存空间

随机推荐

  1. 【Android笔记】Activity涉及界面全屏的
  2. Android显示GIF动画完整示例(二)
  3. 使用Android Dropbox API检查Dropbox上是
  4. 【边做项目边学Android】手机安全卫士04_
  5. android开发中如何从当前页面返回上一页
  6. net. unknownhostexception:无法解析主机
  7. 【Android 开发教程】通过编码实现发送短
  8. Android功能模块化之网络连接状态判断
  9. Android Studio在连接手机时候,出现"Inst
  10. 跟核心虚拟机Dalvik说再见 Android Runti