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. OpenJML入门

    目录 OpenJML 获取 下载 使用 Linux Windows Parsing and Type-checking Extended Static Checking Runtime Asserti ...

  2. Python学习日记(十三) 递归函数和二分查找算法

    什么是递归函数? 简单来说就是在一个函数中重复的调用自己本身的函数 递归函数在调用的时候会不断的开内存的空间直到程序结束或递归到一个次数时会报错 计算可递归次数: i = 0 def func(): ...

  3. centos 7.6 修改vim配色方案

    cd ~ vim .vimrc colorscheme desert

  4. Linux命令——dumpe2fs

    参考:Linux磁盘管理——Ext2文件系统 简介 dumpe2fs用于查询 Ext 家族 superblock以及GDT(Group Descriptor Table,块组描述符表) 信息. 用法 ...

  5. css详解4

    1.固定定位 固定定位,页面内容多,页面滚动起来,才能看到固定定位效果. 比如下面这个,随之滚动条滚动它一直在右边.比如固定导航栏,小广告,回到顶部,应用在这些地方.一直固定位置不变的. 首先让页面能 ...

  6. redis 设置密码并运行外部连接

    redis默认是不能远程访问的,如果希望多台机子共用redis数据库,那就需要开启redis远程连接访问.既然可以远程连接了,那就需要密码登陆,否则不安全.下面是具体的方法,按照步骤一步一步来就OK了 ...

  7. 使用AutoIt实现文件上传

    在网页上上传文件的时候,Selenium无法直接操作如Flash.JavaScript 或Ajax 等技术所实现的上传功能,这时候我们需要借用一个叫做AutoIt的软件来帮助我们事先自动化的上传操作. ...

  8. 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)

    前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...

  9. error: invalid-first-character-of-tag-name错误解决方案

    HTML 特殊字符写法要用原始码,例如: ‘<’ 原始码为 < ‘>’ 原始码为 > 解决示例: 原错误代码 <div><</div> 修改后代码 ...

  10. Scikit-learn库

    1 简介 对Python语言有所了解的科研人员可能都知道SciPy——一个开源的基于Python的科学计算工具包.基于SciPy,目前开发者们针对不同的应用领域已经发展出了为数众多的分支版本,它们被统 ...