fork()子进程与waitpid()

 1 #!/usr/bin/perl
 2 use warnings;
 3 use strict;
 4 use POSIX ":sys_wait_h";
 5
 6 $SIG{CHLD} = sub{
 7   my $pid;
 8   while($pid = waitpid(-1, WNOHANG) > 0){
 9     print "$pid ----------进程已回收!----------------\n"
10   }
11 };
12 foreach(1..5){
13   my $forpid = fork();
14   if($forpid == 0){
15     foreach(‘a‘..‘z‘){
16       print "这是子进程".$_."\n";
17     }
18     print "子进程结束!\n";
19     #sleep(10);
20     exit 0;
21   }
22   else{
23     print "这里父进程!\n这要比子进程晚退出才能收到waitpid的返回值!\n";
24     print "Done\n";
25     #my $pid = wait();
26     sleep(10);
27   }
28 }

在这里, 如果在父进程中改用wait()会出现阻塞

每一个子进程退出后会向父进程发送chld信号

waitpid()中-1表示等待所有子进程, wnohang表示不阻塞

waitpid()返回子进程的进程ID, 出错返回-1

时间: 2024-10-14 19:47:49

fork()子进程与waitpid()的相关文章

Linux系统开发 4 进程资源 环境 fork()子进程 wait() waitpid()僵尸 孤儿进程

<大纲> Linux系统编程 进程资源上限 进程环境变量 进程获取/修改环境变量 创建子进程fork() 最大进程数测试 程序的设置用户ID/组ID/黏住位 exec簇函数,执行程序覆盖堆栈 fork 与execl函数在一起 exec() 与主程序同一个PCB 僵尸进程 wait()回收僵尸进程 证明:父子进程同组pid waitpid() 非阻塞等待子线程发生变化 孤儿进程演示[父进程已经结束,子进程还在运行] 进程资源上限值 [email protected]:~$ cat /proc/s

localtime死锁——多线程下fork子进程

最近测试我们自己改进的redis,发现在做rdb时,子进程会一直hang住,gdb attach上,堆栈如下: (gdb) bt #0 0x0000003f6d4f805e in __lll_lock_wait_private () from /lib64/libc.so.6 #1 0x0000003f6d49dcad in _L_lock_2164 () from /lib64/libc.so.6 #2 0x0000003f6d49da67 in __tz_convert () from /l

nodejs fork 子进程创建任务以及简单的prometheus 监控

以下是一个简单的基于nodejs 的fork 子进程创建子任务,同时使用prometheus 暴露一些简单的metrics 使用express 框架 环境准备 项目结构 ├── Dockerfile ├── README.md ├── app.js ├── docker-compose.yaml ├── grafana │ └── metrics.json ├── metrics.js ├── package.json ├── prometheus.yml ├── send_mail.js ├─

fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)

今天看到一道题,要求是父进程fork出两个子进程,子进程1需要给子进程2发送一个数据,然后子进程2再将这个数据发送给父进程 具体思想如下. 父进程fork出来的子进程的pid,只有父进程保存下来了, 子进程1可以获取到父进程的pid,子进程2可以获取到子进程1的pid,但是子进程1得不到子进程2的pid,只能通过父进程发送. 因为是先产生子进程1,再产生子进程2 fork代码如下 pidChild[2]是全局变量. for(i = 0; i < 2; i++) { pidChild[i] = p

linux c学习笔记----进程创建(fork,wait,waitpid)

1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样. (2)为了区分父进程和子进程,我们必须跟踪fork 的返回值. 当fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1,否则fork 的返回值有重要的作用.对于父进程fork 返回子进程的ID,而对于fork 子进程返回0.我 们就是根据这个返回值来区分父子进程的

Linux下利用fork()创建子进程并使父进程等待子进程结束

int status; pid_t t = fork(); if(t){ waitpid(t, &status, 0); }else{ system("vi temp.txt"); exit(0); } //父进程和子进程均执行完毕后继续执行下去 分析过程: if 和 else 还是选择分支. 主要的原因是,fork() 函数调用一次,返回两次.两次返回的区别是:子进程的返回值是0,父进程返回值为新子进程的进程ID.返回后,父进程执行waitpid(t, &status

系统调用wait、waitpid和exec函数

本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章中,我们已经了解了父进程和子进程的概念,并已经掌握了系统调用exit的用法,但可能很少有人意识到,在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构.在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可

详解wait和waitpid函数

#include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) 进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止. 参数status用来保存被收集进程退出时

wait和waitpid详解【转】

wait的函数原型是:  #include<sys/types.h> #include <sys/wait.h> pid_t wait(int *status)  进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止. 参数: 参数status用来保存被收集进程退出时的一