linux 创建子进程,linux中fork同时创建多个子进程的方法(一)
Fork同时创建多个子进程方法
第一种方法:验证通过
特点:同时创建多个子进程,每个子进程可以执行不同的任务,程序 可读性较好,便于分析,易扩展为多个子进程
int main(void)
{
printf("before fork(), pid = %d\n", getpid());
pid_t p1 = fork();
if( p1 == 0 )
{
printf("in child 1, pid = %d\n", getpid());
return 0;//若此处没有return 0 p1进程也会执行pid_t p2=fork()语句
}
pid_t p2 = fork();
if( p2 == 0 )
{
printf("in child 2, pid = %d\n", getpid());
return 0;//子进程结束,跳回父进程
Printf("hello world\");//没有打印
}
int st1, st2;
waitpid( p1, &st1, 0);
waitpid( p2, &st2, 0);
printf("in parent, child 1 pid = %d\n", p1);
printf("in parent, child 2 pid = %d\n", p2);
printf("in parent, pid = %d\n", getpid());
printf("in parent, child 1 exited with %d\n", st1);
printf("in parent, child 2 exited with %d\n", st2);
return 0;
}
第二种方法: 验证通过
特点:同时创建两个子进程,结构比较繁琐,程序可读性不好,不易扩展
#include
#include
#include//这个头文件不能少,否则pid_t没有定义
main()
{
printf("This is parent process%d\n",getpid());
pid_t p1,p2;
if((p1=fork())==0)
{
printf("This is child_1 process%d\n",getpid());
}
Else
{
if((p2=fork())==0)
{
printf("This is child_2 process%d\n",getpid());
}
Else
{
wait(p1,NULL,0);
wait(p2,NULL,0);
printf("This is parent process%d\n",getpid());
}
}
}
第三种方法:for循环方法
特点:其实每次循环只是创建了单个进程,并没有同时创建多个进程
#include
#include
#include
main()
{
printf("This is parent process%d\n",getpid());
pid_t p1,p2;
int i;
for(i=0;i<=2;i++)
{
if((p1=fork())==0)
{
printf("This is child_1 process%d\n",getpid());
return 0;//这个地方非常关键
}
wait(p1,NULL,0); //父进程等待p1子进程执行后才能继续fork其他子进程
printf("This is parent process%d\n",getpid());
}
}
注意:标注的 return 0对程序结果影响很大
无 return 0情况
#include
#include
#include
main()
{
printf("This is parent process%d\n",getpid());
pid_t p1,p2;
int i;
for(i=0;i<=2;i++)
{
if((p1=fork())==0)
{
printf("This is child_1 process%d\n",getpid());
//return 0;//这个地方非常关键
}
wait(p1,NULL,0);
printf("This is parent process%d\n",getpid());
}
}
结论:父进程会生成n(n+1)/2+1个子进程,N为循环次数,本例中共有7个子进程, 但实际上只有3个是父进程产生的,其余都为子进程fork()出来的。父进程fork了3个进程,第一个子进程执行完之后又fork了2个进程,第2个子进程fork了1个进程。
正确的使用Linux中的用fork()由一个父进程创建同时多个子进程的格式如下:
int status,i;
for (i = 0; i
{
status = fork();
if (status == 0 || status == -1) break;//每次循环时,如果发现是子进程就直接从创建子进程的循环中跳出来,不让你进入循环,这样就保证了每次只有父进程来做循环创建子进程的工作
}
if (status == -1)
{
//error
}
else if (status == 0)//每个子进程都会执行的代码
{
//sub process
}
else
{
//parent process
}
linux 创建子进程,linux中fork同时创建多个子进程的方法(一)相关推荐
- linux 创建子进程,Linux中使用fork创建子进程详解及示例程序
1. 进程 1.1. 什么是进程 当可执行文件开始运行之后,就变为了系统中的一个进程,一个程序(可执行文件)运行起来之后可以创建多个进程执行,称之为多进程程序. 每个进程包含有进程运行环境.内存地址空 ...
- linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...
Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...
- linux编程两个子进程,Linux中fork同时创建多个子进程的方法
怎么创建多个进程呢?我说那还不容易,看下边代码: //省略必要头文件 int main() { pid_t pid[2]; int i; printf("This is %d\n" ...
- Linux中fork()系统调用创建两个子进程
使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h>int main(){int fpid = fork(); ...
- tomcat中request对象是被创建的_Python中对象的创建与引用
上文传送门,又见面向对象,不变的是思想,变的只是语言. 今日开始,我们深入来了解面向对象. 四.创建与引用 1.创建对象的流程 在创建对象时,看不见的手,帮我们做了三件事情,如下图: 1class S ...
- java jframe创建窗体_Java中利用JFrame创建窗体
1. 一个简单例子: Java代码 public class Test(){ public static void main(String[] args){ JFrame frame = new ...
- qt5设置linux系统时间,Qt中使用QLabel显示时间的两种方法
Qt中使用QLabel显示时间的两种方法思路一致,只是实现方法不一样而已. main.cpp #include "displaytime.h" #include int main( ...
- linux下openssh5.3漏洞,linux的低版本中openssh三大漏洞的分析及修复方法
一:漏洞分析最近进行linux系统安全加固分析,进行漏洞扫描扫描分析,不扫不知道,一扫吓一跳,linux系统服务器的 OPENSSH存在3大安全漏洞,祥如下: 1:OpenSSH GSSAPI 处理远 ...
- java中怎样创建线程_java中的线程创建和使用
Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合 ...
最新文章
- 运维想吃透监控系统,就这一篇足够了
- 每日站立会议12/23
- DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp...
- TreeView控件节点重命名后没有进入beginEdit的解决方案
- 数据之路 Day5 - Python基础5
- MFC中CString和int的转换
- linux安装mysql后怎么进去_linux安装mysql详细步骤
- 科技通讯PSD分层海报出击!Hello 5G时代
- SVN Error: “' 'x' isn't in the same repository as 'y' ” during merge (并不在同一个版本库中)...
- Python中可变长度的参数args和**kwargs
- 【最短路】Walls
- 获取类型的完全限定名
- CAD打印后图形不显示?
- 优雅计算算式:后缀表达式
- 使用摄像头解析二维码,且可以生成含具体信息的二维码
- 八大方法改善皮肤黄气
- python提取cad坐标_怎么提取cad中坐标?CAD批量提取坐标点的三种方法
- 程序员为维持游戏开发被迫炒股,一年内反赚1600万;雷军退任天星银行董事会主席;华为开源Karmada将捐赠CNCF...
- MD5简介及使用方式
- L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)