最近做了一次实验:
    1.编写一段程序,利用系统调用fork()函数创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符串,其中,每个进程显示其pid值,及其父进程的pid值。(getpid返回当前进程标识,getppid返回父进程标识。)类似如下显示:父进程显示’"我是爸爸.pid:…爸爸的爸爸是ppid:… ",子进程分别显示’"我是大儿子.pid:…, 我的爸爸是ppid:… "和’“我是小女儿.pid:…, 我的爸爸是ppid:…”。试观察并分析屏幕上的显示结果。

    2. 运行终端,在执行程序之前执行命令“ps -af”,执行程序之后,通过在多进程执行过程中执行命令“ps -af”,显示当前进程状态。试观察并分析屏幕上的显示结果。

接下来阿伟将给大家详细讲解,大家注意听哦:

一、我们先来了解什么是fork()函数:

    一个进程包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,即两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于克隆了一个自己。

    一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。

    :为什么fork会返回两次?

    :在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

二、代码实现

    代码1:

#include <stdio.h>
#include<unistd.h>
int main(){int pid;pid=fork();int i = 0;for(i=0;i<2;i++){if(pid==0){printf("我是大儿子,我的pid是 %d.\n",getpid());}else if(pid>0){printf("我是父亲 ,我的pid是 %d.\n",getpid());pid=fork();if(pid==0){printf("我是小女儿,我的pid是 %d.\n",getpid());}else if(pid>0){printf("我是父亲,我的pid是 %d.\n",getpid());}else{printf("fork() error.\n");}}else{printf("fork() error.\n");}}return 0;
}
结果截图:
代码2:
#include <unistd.h>
#include <stdio.h>
int main(void)
{  pid_t fpid; //fpid表示fork函数返回的值 printf("hello\n");fpid=fork(); if (fpid<0){printf("error in fork!");}else if (fpid==0){while(1){printf("我是大儿子%d,我爸爸是%d.\n",getpid(),getppid());sleep(1);}}else{fpid=fork();if (fpid<0){printf("error in fork!");}else if (fpid==0){while(1){printf("我是小女儿%d,我爸爸是%d.\n",getpid(),getppid());sleep(2);}}else{while(1){printf("我是爸爸%d,爸爸的爸爸是%d.\n",getpid(),getppid());sleep(3);}}}return 0;
}结果截图
**三、分析与总结**从进程并发执行来看,上面的三个进程没有同步措施,只要进程就绪就可能执行,因此各种执行顺序都有可能,所以三个进程的输出次序带有随机性。并且,每当一个进程执    行了一段时间,其它就绪进程可能抢占处理机,因此,多个进程可能交错执行。不过,操作系统实现函数printf( )时,保证了进程每次调用该函数输出一个字符串时不会被中断。本次实验虽然有些难度,但大家不要灰心,仔细想想问题还是能够得到解决的(把fork()函数放入父进程即可实现),加油鸭。

#Linux#folk()函数相关推荐

  1. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  2. linux计时函数的使用

    linux计时函数的使用 linux下计时函数的使用目的是测量程序运行的时间 头文件 #include <sys/time.h> 计时函数 int gettimeofday(struct ...

  3. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  4. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  5. linux shell函数

    linux shell函数

  6. linux fork函数的精辟解说

    此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...

  7. Linux时间函数札记

    关于gmtime.gmtime_r.localtime.localtime_r 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海. 1.函数功能介绍 使用man gm ...

  8. Linux select函数用法和原理

    select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大 ...

  9. linux c 文件拷贝函数,Linux C函数库参考手册

    来自一本绝版的书,虽然没有函数 描述,但是最起码可以知道分类,就可以去 man 了 Linux C函数库参考手册 第1章字符测试 函数 isalnum(测试字符是否为英文字母或数字) isalpha( ...

最新文章

  1. Python 高级特性 (1)- 闭包
  2. Uploadify jquery+falsh+UploadHandler.ashx
  3. 【技术趋势】德勤发布2020技术趋势报告,五个新趋势可引发颠覆性变革
  4. python函数太多_numpy Loadtxt函数似乎消耗了太多内存
  5. RabbitMQ 相关概念
  6. P4245 【模板】任意模数多项式乘法(NTT)
  7. 反向输出dna序列_蛋白质序列反向(逆向)翻译成DNA序列-在线工具
  8. 【转】dicom网络通讯入门(2)
  9. yum 安装apache php mysql
  10. 非maven项目转成maven后pom.xml解决方法
  11. 2013年1月12日学习内容
  12. java手机大头_Java也强大:
  13. ZooKeeper搭建实验
  14. 【Window】使用技巧
  15. PS、PR素材资源网站
  16. asp.net扫描仪编程及ajax图片数据上传
  17. docker安装wechat微信、wxwork企业微信脚本整理
  18. 使用vuex实现一个简单的小应用
  19. 新浪微博的架构发展历程
  20. 三星拿出了四摄手机,可惜诚意不足,挑战国产手机成奢望

热门文章

  1. 【笔记】行测——常识判断之文史常识总结与归纳(六)
  2. numpy.array知识大全
  3. oracle dcd设置,i.MX RT启动数据DCD的结构及配置
  4. 量化投资学习——高频交易研究
  5. gpedit msc组策略面板 win10在哪里_win10找不到gpedit.msc怎么办
  6. iphone用android,有人在用iPhone的同时也在用Android吗?
  7. 美国散户从90降到6他们是如何被消灭的
  8. 互联网摸鱼日报(2023-03-13)
  9. NewSQL是伪命题还是真突破?NewSQL系统综述
  10. 网赚项目:怎么做好一个副业,视频号的引流及变现模式