linux fork()函数
C语言编程创建函数fork() 执行解析
- |
- 浏览:1842
- |
- 更新:2013-04-22 15:12
- |
- 标签:c语言
概述
最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下:
1.函数本身
(1)头文件
#include
#include
(2)函数原型
pid_t fork( void);
(pid_t 是一个宏定义,其实质是int 被定义在#include中)
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1
(3)函数说明
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,子进程有了独立的地址空间。
2.代码执行解释
(1)代码如下图所示
(2)分析
由操作系统相关知识可知,进程是系统资源分配的基本单位,因此子进程与父进程不共享进程资源空间。在执行代码段第8行之前,系统中只有默认的主进程。在执行完代码段第8行后,系统中就有了两个进程,即主进程和由其创建的子进程。
创建子进程,fork()函数返回两个数值,若创建成功,子进程中返回0;父进程返回子进程ID。用资源空间图示如下:
执行了fork()函数后,主进程为父进程生成了一份资源空间的副本。主进程中的pid为子进程的pid(pid>0),子进程中的pid为0。
在fork()函数之后父进程与子进程都从下一行执行,即第9行。因为主进程中pid>0,可以执行else if(pid>0)段代码,子进程pid=0,可以执行else if(pid==0)段代码。
(3)代码执行结果如下:
可见,"Before the fork ..."只执行了一次。"After the fork ..."执行了两次。
(具体的执行结果,可能会由于进程调度的不同,后面的四个输出顺序可能不同。不过第一个输出的一定是"Before the fork ...")。
linux fork()函数的更多相关文章
- linux fork函数与vfork函数,exit,_exit区别
man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...
- Linux—fork函数学习笔记
fork()函数 在赋值语句pid = fork();之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同.> 两个进程中,原先就存在的那个被 ...
- linux fork函数与vfork函数
一.fork1. 调用方法#include <sys/types.h>#include <unistd.h> pid_t fork(void);正确返回:在父进程中返回子进程的 ...
- linux fork()函数 转载~~~~
转自 :: http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork ...
- Linux fork函数具体图解-同一时候分析一道腾讯笔试题
原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...
- linux fork函数浅析
#include <sys/types.h> #include <unistd.h> /* 功能:复制进程 參数:无 返回值: 成功: 父进程:返回子进程id 子进程:返回0 ...
- Linux C 中 fork() 函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- linux源码阅读笔记 fork函数
在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork ...
- linux的fork函数
fork函数 头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include< ...
随机推荐
- linux mysql-server和mysql-client
我认为server和client是DBMS的两个面向不同操作对象的工具.server是DBMS面向物理层次,包含存储数据的一系列机制.处理方法的集成:client是DBMS面向用户,提供一系列工具为用 ...
- Ambari删除服务
ambari-cassandra-service上面推荐的方法: curl -u admin:$PASSWORD -i -H 'X-Requested-By: ambari' -X PUT -d '{ ...
- LeetCode OJ 162. Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- linux ssh连接不自动断开
修改linux服务器ssh配置文件: vim /etc/ssh/ssh_config 修改两处的值为: ClientAliveInterval ClientAliveCountMax 使修改的ssh配 ...
- Python基础(四)-集合
补充: 数据类型分类: 1.按照数据可变不可变: 可变:列表.字典 不可变:数字.字符串.元组 x={':1} print(id(x)) x.update({':2}) print(x) print( ...
- Tomcat 启动报错:javax.naming.NamingException: No naming context bound to this class loader
分析原因:在类中使用了Log .只是在项目lib路径下添加了slf4 的jar包,在Tomcat\lib下未添加 解决方案:将slf4的jar包放到tomcat\lib下.
- C# 获取字符的Unicode编码
using UnityEngine;using System.Collections;using System.Collections.Generic; List<); string chars ...
- 入门级(python)
1.素数,求1-100之间的素数(想在代码中写中文注释,加一句#coding=utf-8,注意等号左右没空格) def isPrime(n): if(n == 1): return False els ...
- Hibernate的查询,二级缓存,连接池
Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...
- 用python写刷票程序
刷票一般要突破以下限制: 1.验证码识别 2.同一ip不可连续投票 解决办法 1.用tesseract工具,链接在此 https://code.google.com/p/tesseract-ocr/ ...