复制进程映像 fork()

要想让进程同时执行多个函数,我们可以使用线程或从源程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前指向的线程。

我们可以通过调用fork创建一个新进程。这个系统调用复制当前进程,在进程表中创建一个新的表项,新表项中许多属性和当前进程是相同的。

新进程几乎和原进程一模一样,执行的代码也全部一样,但新进程有自己的数据空间,环境和文件描述符。

fork和exec函数结合使用就是创建新进程所需要的一切了。

#include<sys/type.h>

#include<unistd.h>

pid_t fork(void);

在父进程中调用返回的是新的子进程的PID。新进程进继续执行,不过子进程中fork返回的是0.父子进程可以通过这一点来判断谁是父子。

如果fork失败返回-1,通常是因为父进程所拥有的子进程数目超过规定限制。

fork1.c    

#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char *message;
int n; printf("fork program starting!\n");
pid = fork();
switch(pid)
{
case -:
perror("fork failed!");
exit();
case :
message = "this is child";
n = ;
break;
default :
message = "this is parenet";
n = ;
break;
} for(;n>;n--)
{
puts(message);
sleep();
}
exit();
}

等待一个进程

当用fork启动一个子进程时,紫禁城就有了自己的生命周期并将独立运行。我们可以通过在父进程中调用wait函数让父进程等待子进程的结束。

#include<sys/types.h>

#inlcude<sys/wait.h>

pid_t wait(int *stat_loc);

wait系统调用将暂停父进程知道他的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,及

子进程main函数的返回值或子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入它所指向的位置。

我们可以通过sys/wait.h文件中定义的宏来解释状态信息。

wait.c

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("fork program starting!\n");
pid = fork();
if (pid < )
{
printf("this is fork error!\n");
exit();
}else if(pid == )
{
printf("this is child!\n");
message = "child";
n = ;
exit_code = ;
}else
{
printf("this is parent!\n");
n = ;
message = "parent";
exit_code = ;
}
for(;n>;n--)
{
puts(message);
sleep();
}
//程序这一部分等待子进程完成。
if (pid != )
{
int stat_val;
pid_t child_pid; child_pid = wait(&stat_val);
printf("child has finished:pid=%d\n",child_pid);
printf("this stat_val is :%d\n",stat_val);
//如果子进程正常结束,它就取一个非零值
if(WIFEXITED(stat_val))
{
//如果WIFEXITED非零,则返回子进程的退出码
printf("child exited with code %d\n",WEXITSTATUS(stat_val));
} else
{
printf("child terminated abnormally\n");
} } exit(exit_code); }

以上内容来自《Linux程序设计第四版》

Linux学习2-fork的更多相关文章

  1. Linux学习之“fork函数”

    n返回值: fork函数调用一次,但是返回两次:在子进程中返回0,在父进程中返回子进程ID,出错返回-1.通过返回值,可以确定是在父进程还是子进程中. n子进程和父进程继续执行fork调用之后的指令. ...

  2. Linux学习笔记(7)-进程

    明天开始学习进程,在以前的单片机开发中,都没有进程这个概念,但从网上了解到,这个东西在操作系统中似乎具有很重要的地位,一定好好学习! --------------------------------- ...

  3. 实验楼 linux 学习

    实验楼 linux 学习     一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami   ====--------====== 输入的第一列表示打 ...

  4. 我的Linux学习历程:那些我看过的Linux书籍们

    [+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫 ...

  5. Linux学习之“vfork函数”

    为什么使用vfork()? 希望父子进程执行不同的代码.例如: 网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达. ...

  6. Linux学习笔记——管道PIPE

    管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe).# include <unistd.h> int pipe(int filedes[2]); //创建管道 pipe( ...

  7. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  8. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码

    在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...

  9. Linux学习笔记之兄弟连

    systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...

  10. Linux学习内容

    Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...

随机推荐

  1. 字符串经过base64编码后的长度与原字符串的长度是什么关系呀?

    beforeEncode为Encode之前的字符串 那么Encode后的字符串长度为: 1.如果beforeEncode.length()是3的整数倍,那么长度为  (beforeEncode.len ...

  2. json数据进行格式化

    <?php /** Json数据格式化 * @param Mixed $data 数据 * @param String $indent 缩进字符,默认4个空格 * @return JSON */ ...

  3. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  4. L2 L3 L4

    第二层交换机,是根据第二层数据链路层的MAC地址和通过站表选择路由来完成端到端的数据交换的.因为站表的建立与维护是由交换机自动完成,而路由器又是属于第三层设备,其寻址过程是根据IP地址寻址和通过路由表 ...

  5. [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较

    转自:AVL树.红黑树.B/B+树和Trie树的比较 AVL树 最早的平衡二叉树之一.AVL是一种高度平衡的二叉树,所以通常的结果是,维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应 ...

  6. SpringBoot之使用jpa/hibernate

    Springboot版本是2.1.3.RELEASE 1.依赖 List-1.1 <dependency> <groupId>org.springframework.boot& ...

  7. Navicat使用教程:获取MySQL中的高级行数(第2部分)

    Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL.Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便. 在上篇文章中,我 ...

  8. dp的一些计划

    抱歉这是鸽子贴. 树形dp [x][[POI2014]HOT-Hotels](https://www.luogu.org/problemnew/show/P3565) [x][[HAOI2015]树上 ...

  9. 数据挖掘领域经典分类算法 —— C4.5算法(附python实现代码)

    目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...

  10. HDU 1711 Number Sequence (字符串匹配,KMP算法)

    HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...