每天学五分钟 Liunx 0101 | 服务篇:创建进程
创建子进程
[root@lianhua process]$ cat exec.sh
#!/bin/bash
ps -lf
echo $BASHPID
exec ls [root@lianhua process]$ /bin/bash exec.sh
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 36259 36250 0 80 0 - 28754 do_wai 13:45 pts/15 00:00:00 -bash
0 S root 53778 36259 0 80 0 - 28296 do_wai 17:29 pts/15 00:00:00 /bin/bash exec.sh
0 R root 53779 53778 0 80 0 - 38356 - 17:29 pts/15 00:00:00 ps -lf
53778
exec.sh
fork
[root@lianhua process]$ cat process1.cpp
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h> int main()
{
pid_t pid;
pid = fork();
if (pid < 0)
{
perror("fork error:");
exit(1);
}
if (pid == 0)
{
printf("I am the child process.\n");
printf("pid: %d\tppid:%d\n",getpid(),getppid());
printf("I will sleep five seconds.\n");
sleep(5);
printf("pid: %d\tppid:%d\n",getpid(),getppid());
printf("child process is exited.\n");
}
else
{
printf("I am father process.\n");
printf("father process is exited.\n");
}
return 0;
} [root@lianhua process]$ ./process1.out
I am father process.
pid: 2365 ppid:36259
father process is exited.
I am the child process.
pid: 2366 ppid:2365
I will sleep five seconds.
[root@lianhua process]$ ps -lf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 S root 2366 1 0 80 0 - 1056 hrtime 20:53 pts/15 00:00:00 ./process1.out
0 R root 3799 36259 0 80 0 - 38356 - 20:53 pts/15 00:00:00 ps -lf
4 S root 36259 36250 0 80 0 - 28754 do_wai 13:45 pts/15 00:00:00 -bash
[root@lianhua process]$ pid: 2366 ppid:1
child process is exited.
while(getppid() != 1)
sleep(1);
僵尸进程
[root@lianhua process]$ cat process3.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h> int main()
{
pid_t pid;
while(1)
{
pid = fork();
if (pid < 0)
{
perror("fork error:");
exit(1);
}
else if (pid == 0)
{
printf("I am a child process PID=%d, PPID=%d.\nI am exiting.\n", getpid(), getppid());
exit(0);
}
else
{
printf("pid: %d\tppid:%d\n",getpid(),getppid());
sleep(5);
continue;
}
}
return 0;
} [root@lianhua process]$ ./process3.out
pid: 6345 ppid:36259
I am a child process PID=6346, PPID=6345.
I am exiting.
pid: 6345 ppid:36259
I am a child process PID=6367, PPID=6345.
I am exiting.
pid: 6345 ppid:36259
I am a child process PID=6535, PPID=6345.
I am exiting.
^C [root@lianhua ~]$ ps -lA | grep defunct
1 Z 0 6346 6345 0 80 0 - 0 do_exi pts/15 00:00:00 process3.out <defunct>
1 Z 0 6367 6345 0 80 0 - 0 do_exi pts/15 00:00:00 process3.out <defunct>
1 Z 0 6535 6345 0 80 0 - 0 do_exi pts/15 00:00:00 process3.out <defunct>
[root@lianhua ~]$ kill -9 6345
[root@lianhua process]$ ./process3.out
...
pid: 6345 ppid:36259
I am a child process PID=6656, PPID=6345.
I am exiting.
Killed
[root@lianhua process]$
1. 调用信号处理函数
- 如果所有子进程运行,则阻塞;
- 如果一个子进程终止,正等待父进程获取其终止状态,则取得该子进程的终止状态并立即返回;
- 如果没有任何子进程,则立即出错返回;
[root@lianhua process]$ cat process3.1.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <wait.h> int main()
{
pid_t pid;
while(1)
{
pid = fork();
if (pid < 0)
{
perror("fork error:");
exit(1);
}
else if (pid == 0)
{
printf("I am a child process PID=%d, PPID=%d.\nI am exiting.\n", getpid(), getppid());
exit(0);
}
else
{
printf("pid: %d\tppid:%d\n",getpid(),getppid());
wait(NULL);
sleep(5);
continue;
}
}
return 0;
} [root@lianhua process]$ ./process3.1.out
pid: 9207 ppid:36259
I am a child process PID=9208, PPID=9207.
I am exiting.
pid: 9207 ppid:36259
I am a child process PID=9297, PPID=9207.
I am exiting.
pid: 9207 ppid:36259
I am a child process PID=9306, PPID=9207.
I am exiting.
^C [root@lianhua ~]$ ps -lA | grep defunct
[root@lianhua ~]$ ps -lA | grep defunct
2. fork 两次
[root@lianhua process]$ cat process5.cpp
#include <unistd.h>
#include <stdio.h> int main(void)
{
int i=0;
printf("i child/father ppid pid fpid\n");
for(i=0; i<2; i++)
{
pid_t fpid=fork();
if(fpid == 0)
printf("%d child %4d %4d %4d\n", i, getppid(), getpid(), fpid);
else
printf("%d father %4d %4d %4d\n", i, getppid(), getpid(), fpid);
}
return 0;
} [root@lianhua process]$ ./process5.out
i child/father ppid pid fpid
0 father 36259 45119 45120
0 child 45119 45120 0
1 father 36259 45119 45121
1 father 45119 45120 45122
1 child 45120 45122 0
1 child 1 45121 0
[root@lianhua process]$ cat process5.cpp
#include <unistd.h>
#include <stdio.h> int main(void)
{
int i=0;
printf("i child/father ppid pid fpid\n");
for(i=0; i<2; i++)
{
pid_t fpid=fork();
if(fpid == 0)
printf("%d child %4d %4d %4d\n", i, getppid(), getpid(), fpid);
else
{
printf("%d father %4d %4d %4d\n", i, getppid(), getpid(), fpid);
sleep(20);
}
}
return 0;
} [root@lianhua process]$ ./process5.out
i child/father ppid pid fpid
0 father 36259 10739 10740
0 child 10739 10740 0
1 father 10739 10740 10741
1 child 10740 10741 0
1 father 36259 10739 10764
1 child 10739 10764 0 [root@lianhua ~]$ ps -lA | grep defunct
0 Z 0 10500 1720 0 80 0 - 0 do_exi ? 00:00:00 fluentd-report <defunct>
1 Z 0 10740 10739 0 80 0 - 0 do_exi pts/15 00:00:00 process5.out <defunct>
1 Z 0 10764 10739 0 80 0 - 0 do_exi pts/15 00:00:00 process5.out <defunct>
[root@lianhua ~]$ ps -lA | grep defunct
0 Z 0 10500 1720 0 80 0 - 0 do_exi ? 00:00:00 fluentd-report <defunct>
每天学五分钟 Liunx 0101 | 服务篇:创建进程的更多相关文章
- c++ 网络编程(八) LINUX-epoll/windows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多进程服务端创建进程资源浪费问题
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622548.html 锲子:关于并发服务器中的I/O复用实现方式,前面在网络编程系列四还是五来 ...
- c++ 网络编程(四) LINUX/windows下 socket 基于I/O复用的服务器端代码 解决多进程服务端创建进程资源浪费问题
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,继上一篇说到多进程服务端也是有缺点的,每创建一个进程就代表大量的运 ...
- 五分钟学Java:如何才能学好Java Web里这么多的技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画
原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...
- 五分钟给你的 gRPC服务 加上 HTTP 接口
gRPC 服务要加 HTTP 接口? go-zero 给大家带来极简的 RESTful 和 gRPC 服务开发体验的同时,社区又给我们提出了新的期望: 我想只写一次代码 既要 gRPC 接口 也要 H ...
- [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
[分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...
- 《sed的流艺术之一》-linux命令五分钟系列之二十一
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- GC算法精解(五分钟让你彻底明白标记/清除算法)
GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...
- zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》
本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图 zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...
随机推荐
- KNN算法之KD树(K-dimension Tree)实现 K近邻查询
KD树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,如范围搜索和最近邻搜索. KD树使用了分治的思想,对比二叉搜索树(BST),KD树解决的是多维空间内的最近点(K近点)问题.( ...
- 2021AI量化投资训练营重磅升级,自带编程的优势显而易见
量化交易规模突破万亿大关 国内量化交易规模快速发展,今年量化基金已突破万亿大关,并且量化私募的整体业绩十分亮眼,过去5年一线量化私募的超额收益基本在20%~30%,量化交易的占比已达到20%-30%( ...
- MySQL 8.0.32 InnoDB ReplicaSet 配置和手动切换
1.环境准备 主库:192.168.137.4 mytest3 从库:192.168.137.5 mytest4 MySQL: 8.0.32 2.配置 ReplicaSet 实例 启动 mysql s ...
- 华企盾DSC防泄密:PTC Creo程序打开加密文件报错
SolidDesigner.exe(PTC Creo)程序打开加密文件报错,添加的进程不对,任务管理器查看详细信息即可找到进程
- STM32CubeMX教程3 GPIO输入 - 按键响应
1.准备材料 开发板(STM32F407G-DISC1) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) 2 ...
- 通过JDK动态代理类实现一个类中多种方法的不同增强
1.为什么说JDK动态代理必须要实现当前父接口才能使用 JDK动态代理是基于接口的代理,它要求目标类(被代理的类)必须实现一个或多个接口.这是因为JDK动态代理是通过创建目标类的接口的代理对象来实现的 ...
- electron入门之通知Notification(二)
electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...
- 文心一言 VS 讯飞星火 VS chatgpt (40)-- 算法导论5.4 4题
四.一次聚会需要邀请多少人,才能让其中 3 人的生日很可能相同? 文心一言: 为了解决这个问题,我们需要先计算出所有可能的生日组合数,然后计算出其中生日相同的组合数. 已知需要邀请的人数为:23人 根 ...
- 共筑数字化未来,金山办公携手华为云完成文档中心和GaussDB适配
摘要:金山办公携手华为云完成金山办公自主研发的"WPS文档中心系统"与华为云GaussDB相互兼容性测试认证,并获得华为云授予的<技术认证书>. 本文分享自华为云社区& ...
- DarkMode(2):深色模式解决方案——css颜色变量实现Dark Mode
暗黑模式实现,最初的设计,就是参考之前的主题模式.所谓多套主题/配色/皮肤,就是我们很常见的换肤功能.换肤简单的实现就是更换 css实现不同样式呈现不同肤色. 之前做不同颜色的皮肤,暗黑模式可以单做其 ...