fork()函数 图解
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()函数 图解的更多相关文章
- Linux fork函数具体图解-同一时候分析一道腾讯笔试题
原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...
- Linux C 中 fork() 函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- 进程间通信--fork函数
#include <unistd.h> pid_t fork(void); fork() creates a new process by duplicating the calling ...
- Fork函数初识
fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...
- fork()函数详解
原文链接:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函 ...
- fork函数
在Unix/Linux中用fork函数创建一个新的进程.进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程.该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程. ...
- Linux—fork函数学习笔记
fork()函数 在赋值语句pid = fork();之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同.> 两个进程中,原先就存在的那个被 ...
- linux fork函数与vfork函数,exit,_exit区别
man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...
- fork()函数
现代操作系统提供的三种构造并发程序的方法: •进程 一个进程实体包括:代码段,数据段, 进程控制块 fork()函数:通过系统调用创建一个与原来一模一样的子线程,[用来处理请求信号,而父进程继续一直处 ...
随机推荐
- .net core 定时程序
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft. ...
- gcc 编译控制选项
gcc 编译控制选项前面已经讲过, gcc 的基本用法是:$ gcc [选项] [文件名]gcc 有很多编译控制选项,使得 gcc 可以根据不同的参数进行不同的编译处理,可供 gcc调用的参数大约有 ...
- CSSTab栏下划线跟随效果
神奇的 ~ 选择符 对于当前 hover 的 li ,其对应伪元素的下划线的定位是 left: 100%,而对于 li:hover ~ li::before,它们的定位是 left: 0. ul li ...
- js中for循环点击事件(闭包)
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- Referenced file contains errors (xml文件第一行小红叉错误)
转自:http://www.manongjc.com/article/30401.html 在eclipse中开发网页时,经常会遇到写xml文件时第一行无缘无故报错.在最左面的行数上面报出一个小红叉, ...
- Winmanager,NERDTree和MiniBufExplorer
NERDTree树形浏览文件 MiniBufExplorer多文件同时编辑 Winmanager将NERDTree和MiniBufExplorer界面整合 下载 http://www.vim.org/ ...
- SpringBoot学习<一>——快速搭建SpringBoot
这是我的第一篇博客,博客记录我以后的学习,包括一些总结之类的东西,当然,这些记录是针对于与我个人而言的,可能有些地方会有不好的,或者出现错误,欢迎大家来指正(如果有人看的话)废话不多说.进入正题:Sp ...
- PowerDesigner 连接数据库,更新数据库;
首先:以管理员身份运行Powerdesigner 一.连接服务器的某个数据库: 点击新建数据源图标 选择数据源类型:用户数据源:这里说是只用于当前机器,实际局域网里的都可以. Successfully ...
- docker部署Redmine项目管理平台
1.下载镜像(自己用的3.4版本) docker pull redmine:3.4 docker pull mysql:5.7 2.运行 docker run -p 3306:3306 --name ...
- 1.后期特效合成AE概述&&工作流程&&磁盘缓存清理
1.简介: After Effects:是一款专业的后期制作与特效合成软件: 2.AE界面介绍 2.1 项目面板 2.2 合成预览面板 2.3 时间线面板 2.4 辅助面板 2 ...