code

#include<stdio.h>
#include <getopt.h>
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std; int main(int argc, char* argv[]) {
pid_t pid=;
int clients=;
printf("parent %d\n",getpid()); for(int i=;i<clients;i++)
{
//在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。
//在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。
//我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
pid=fork(); if( pid < (pid_t) )
{
printf("something wrong!");
}
if(pid <= (pid_t) )
{
/* child process or error*/
//sleep(1); /* make childs faster */
}
if(pid == (pid_t) )
{
printf("index%d child : ppid:%4d pid:%4d fpid:%4d\n",i,getppid(),getpid(),pid);
}
else
{
printf("index%d parent : ppid:%4d pid:%4d fpid:%4d\n",i,getppid(),getpid(),pid);
}
}
return ;
}

输出

parent 

index0 parent : ppid: pid: fpid:
index0 child : ppid: pid: fpid: index1 parent : ppid: pid: fpid:
index1 child : ppid: pid: fpid:
index1 parent : ppid: pid: fpid:
index1 child : ppid: pid: fpid: Program ended with exit code:

根据输出结果,我们画出下面这个结构图

可以看到,由于我是使用Xcode运行的代码,Xcode的pid是88994

以上代码运行后的进程pid是88993

两次循环以后,88993 fork 出了88996,88997,88998三个子进程,算上自身,一共有四个进程。

i=0时,88993创建了一个子进程88996,此时这两个进程的程序的i=1,也就是说,此时两个进程开始执行的位置是一样的,是从88993执行完第一次循环后的那个 位置开始执行。

参考:

https://www.cnblogs.com/love-jelly-pig/p/8471206.html

fork()函数 图解的更多相关文章

  1. Linux fork函数具体图解-同一时候分析一道腾讯笔试题

    原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...

  2. Linux C 中 fork() 函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...

  3. 进程间通信--fork函数

    #include <unistd.h> pid_t fork(void); fork() creates a new process by duplicating the calling ...

  4. Fork函数初识

    fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...

  5. fork()函数详解

    原文链接:http://blog.csdn.net/jason314/article/details/5640969  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函 ...

  6. fork函数

    在Unix/Linux中用fork函数创建一个新的进程.进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程.该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程. ...

  7. Linux—fork函数学习笔记

    fork()函数 在赋值语句pid = fork();之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同.> 两个进程中,原先就存在的那个被 ...

  8. linux fork函数与vfork函数,exit,_exit区别

    man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...

  9. fork()函数

    现代操作系统提供的三种构造并发程序的方法: •进程 一个进程实体包括:代码段,数据段, 进程控制块 fork()函数:通过系统调用创建一个与原来一模一样的子线程,[用来处理请求信号,而父进程继续一直处 ...

随机推荐

  1. <P>标签是什么?怎么用!

    <P>标签它是一个段落标签,它和<br>标签不一样.会自行起一行段落,并且可以作为一个盒子来使用.可以单独定义它. 比如下图: <p>这个就是一个段落</p& ...

  2. FreeRTOS队列操作

    API函数 //创建 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemS ...

  3. python(open文件读取)

    一.open文件读取 1.open('file','mode')打开一个文件 file 要打开的文件名,需加路径(除非是在当前目录) mode 文件打开的模式 需要手动关闭close 2.with o ...

  4. javascript_16-对象字面量

    JSON与对象字面量相似,仅仅是属性需要使用双引号引号引起. json是描述数据的一种规范 什么是JSON JavaScript Object Notation (JavaScript 对象表示形式) ...

  5. 阿里云ECS服务器设置端口(允许访问设置)

    1.登录阿里云找到对应的服务器按照如下箭头指示: 2.点击“安全组配置”后进入到如下界面,点击“配置规则”进入详情配置界面. 3.点击“修改”可对特定的端口进行访问配置,如下图: 至此结束.

  6. curl-手册

    Manual -- curl usage explained Related: Man Page FAQ LATEST VERSION   You always find news about wha ...

  7. JSONObject对象

    1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包. 方法: 的getString() ...

  8. 安装k8s,单master脚本

    这个以一个普通xxx帐户运行即可. 因为上面root帐号作了sudoer的操作的. 还有,最好将xxx帐号加入docker组,这样xxx也可以执行docker命令了. 可以看到,这个脚本还需要其它目录 ...

  9. Spring-02 -Spring 创建对象的三种方式 :1.通过构造方法创建/2.实例工厂/3.静态工厂

    通过构造方法创建  1.1 无参构造创建:默认情况. 1.2 有参构造创建:需要明确配置 1.2.1 需要在类中提供有参构造方法 1.2.2 在 applicationContext.xml 中设置调 ...

  10. #2590. 「NOIP2009」最优贸易

    C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...