关于Linux下 fork() 函数的总结


看这一段代码,我想了一会儿,然后实验了一下午。

#include <unistd.h> #include <stdio.h> int main() {  pid_t pid;     pid=fork();     if(pid==0){         while(1){             sleep(1);        printf("haha\n");         }     }     if(pid>0)     {         while(1){           sleep(1);             printf("hehe\n");         }     } }

代码显而易懂,我开始想不明白,如果按照顺序结构结构,那么肯定会陷入死循环,要么一直打印出haha,要么一直打印出hehe。

事后,将代码改了该,然后发现了一些规律,然后总结出fork() 函数的功能。

注: PID:进程号 PPID:父进程号;TIME : 占用CPU的时间

我分了以下几种情况。

第一种: 注释掉第一个while语句中的sleep() 函数,得到如下结果

PID PPID TIME
6060 3520 00;00;00
6061 6060 00;00;07

程序运行结果为  haha haha 。。。

第二种: 注释掉第二个while语句中的 sleep() 函数,得到如下结果:

PID PPID TIME
6235 3520 00:00:01
6236 6235 00:00:00

程序运行结果为 hehe hehe 。。。

第三种   :保留两个while语句的sleep()函数,得到如下结果

PID PPID TIME
6238 3520 00:00:00
6239 6328 00:00:00

程序运行结果为 : hehe haha  hehe haha 。。。

其实程序很简单,如果按照正常的程序执行顺序,为顺序执行,结果想了好久都想不通,终于经过一番折腾后,发现了一些信息。

很显然,如果只保留两个sleep中的一个,则会陷入一个死循环里;如果两者都保留,会交替出现所打印出的字符;显然,sleep()函数具有使进程休眠的作用,并让出CPU;按照这样理解的话,交替出现字符的现象也能理解。其次,子进程是从父进程分出来的,可以从进程号中看出,而且,子进程的初始化进程号为0。从最后的结果看出,进程可以在两者之间切换,且占用CPU的时间几乎为0.(其实,也可以从占用CPU的时间中发现到底是哪个进程在运行)

总结一下,UNIX中的 fork()函数, procid=fork() ,这条语句的执行简单的把称作为 parent 的当前进程进行复制。父进程和新创建的被称作“孩子”的进程的唯一区别是变量 procid;

父进程中它的值是子进程的进程号,而在子进程·中这个值是0.这样就允许两个进城都可以以确定的标识并各自运行。一般来说, fork() 语句后是如下形式:

if(procid==0) do child_processing;
else do parent processing;

  两个进程之中的某一个,比如说子进程,可能通过在 do_child_processing 语句中的某处执行系统调用exec () 覆盖自身。这个函数指定一个新的程序作为起参数之一,

然后新的进程作为子进程继续执行。

原文地址:https://www.cnblogs.com/guoyu1024/p/9704211.html

时间: 2024-10-11 16:21:11

关于Linux下 fork() 函数的总结的相关文章

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

Linux下Fork与Exec使用

http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程

linux中fork()函数详解[zz]

转载自:http://www.cnblogs.com/york-hust/archive/2012/11/23/2784534.html 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有

Linux下Kill函数用法

http://www.cnblogs.com/winnxm/archive/2010/01/22/1654502.html [ KILL ]功能描述: 用于向任何进程组或进程发送信号. 1 #include <sys/types.h> 2 3 #include <signal.h> 4 5 int kill(pid_t pid, int sig); 6 7 参数: pid:可能选择有以下四种 1. pid大于零时,pid是信号欲送往的进程的标识. 2. pid等于零时,信号将送往所

【C/C++】Linux下system()函数引发的错误

http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食  恋恋美食 发布时间: 2012/04/21 11:33 阅读: 11393 收藏: 21 点赞: 8 评论: 4 今天,一个运行了近一年的程序突然挂掉了,问题定位到是system()函数出的问题,关于该函数的简单使用在我上篇文章做过介绍: http://my.oschina.net/renhc/blog/53580 先看一下问题 简单封装了一下sys

Linux下system()函数引发的错误

先看一下问题 简单封装了一下system()函数: 1 int pox_system(const char *cmd_line) 2 { 3     return system(cmd_line); 4 } 函数调用: 1 int ret = 0; 2 ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); 3 if(0 != ret) 4 { 5     Log("zip file fa

Linux下select函数的使用

Linux下select函数的使用 转载:http://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html 一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发 生,

[Android Memory] Linux下malloc函数和OOM Killer

http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请失败返回NULL.默认情况下,Linux内核使用“乐观的”分配内存策略,首先粗略估计系统可使用的内存数,然后分配内存,但是在使用的时候才真正把这块分配的内存给你.这样一来,即使用malloc申请内存没有返回NULL,你也不一定能完全使用这块内存,特别是在一次或连续多次申请很多内存的时候. 如果一直连

Linux下system函数

http://www.jb51.net/article/40517.htm   浅析如何在c语言中调用Linux脚本 http://blog.csdn.net/koches/article/details/7552034 C语言system()函数 http://blog.csdn.net/lazy_tiger/article/details/1771705 System函数与脚本的后台执行 Linux下system函数