复制进程映像 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. PHP 更改session存储方式为Redis

    前言: 服务器默认的session存放方式是file.当客户端发送请求带有PHPSESSID时是顺序的去比对session存储文件,如果有5000个session文件,那就有可能需要比对4998次那么 ...

  2. HBase 架构与工作原理3 - HBase 读写与删除原理

    本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.前言 在 HBase 中,Region 是有效性和分布的基本单位,这通常也是我们在维护时能直接操作的最小单位.比如当一个集群 ...

  3. [转帖]超能课堂 CPU制作过程

    http://www.expreview.com/50814.html 一般来说,我们对IC芯片的了解仅限于它概念,但是对于已经应用到各式各样的数码产品中IC芯片是怎么来的?大家可能只知道制作IC芯片 ...

  4. [转帖] sqlserver CAL 授权模式下 只能够有20个core的使用问题

    http://www.cnblogs.com/diabloxl/p/3623640.html?utm_source=tuicool&utm_medium=referral 公司这边性能组老师进 ...

  5. 使用Word 进行UTF8 以及字符串编码的转换操作

    1. 使用Word文档能够实现 字符串和utf8编码的转换. 快捷键是 ALT+X 在知乎的一个里面看到一个说法: ㍾ ㍽ ㍼ ㍻ - 这四个在Unicode表里是倒序排列的,而且只预留了这四个年号, ...

  6. vue 组件 单选切换控制模板 v-bind-is

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>T ...

  7. IE Only的userData

    上次我们提到了本地存储的一个方式,那就是Cookie,不过遗憾的是Cookie保存的数据量非常小,更详细的可以参考<在 Internet Explorer 中的 cookie 的数字和大小限制& ...

  8. .Net iTextSharp 生成pdf

    拿别人例子 public ActionResult index() { var ms = new MemoryStream(); #region CreatePDF Document document ...

  9. BZOJ3158 千钧一发(最小割)

    可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...

  10. Mac突然连不上WiFi

    标签(空格分隔): 杂七杂八的问题 从昨晚开始,Mac突然连不上WiFi了,人又在图书馆,上不了网好焦急.于是搜了很多方法,也不知是哪个起作用了,反正现在可以了. 步骤一 打开"Finder ...