linux fork

1. 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示‘a‘,子进程分别显示字符‘b‘和字符‘c‘。多执行几次,观察并记录屏幕上的显示结果,分析原因, 写入实验报告。

截图:

原因:如下图解释

2. 修改上述程序,每一个进程循环显示一句话。子进程显示‘daughter…‘及‘son…‘,父进程显示 ‘parent…‘,多执行几次,观察并记录屏幕上的显示结果,分析原因, 写入实验报告。

同1一样

3. 利用vi编辑器,创建源代码文件ft1.c,内容如下

#include <stdio.h>

int main(void)

{

int i;

for(i=0; i<2; i++)

{

fork();

printf("-");

}

return 0;

}

观察并记录屏幕上的显示结果,分析原因,写入实验报告。

结果:

原因:

这时,打印出的“-”被执行了8次,可以从下图(手画)得到解释:

4. 修改ft1.c,内容如下

#include <stdio.h>

int main(void)

{

int i;

for(i=0; i<2; i++)

{

fork();

printf("-\n");

}

return 0;

}

注意代码的修改,多执行几次,观察并记录屏幕上的显示结果,分析原因,写入实验报告。

打印出6次,理由是加上\n后,printf被立刻打印,所以子进程不会复制父进程的缓冲内容;即只打印6次,分别出处如下:

5. 总结性解释说明:为什么fork()调用一次,返回两次

在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,

fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,

因为子进程没有子进程,所以其fpid为0.

时间: 2024-12-25 15:24:52

linux fork的相关文章

Linux fork炸弹解析 ——Linux Fork Bomb

Linux Fork Bomb :(){ :|: & };:是一个bash函数,以Fork Bomb闻名,是一个拒绝服务攻击 的Linux 系统.如果你好奇地去执行了这个命令,那么赶快重启系统吧~! 命令解析 :() { : | : & };: :在这里是一个函数名,我们定义之,并在后面执行它. :|:&,:函数的输出通过管道传给另一个冒号函数作为输入,并且在后台执行. { };标识着里面的内容是一个函数主体. 最后一个:为定义完成后的一次函数执行. 原理解析 首先需要说明的是:是

Linux fork那些隐藏的开销

fork是一个拥有50年历史的陈年系统调用,它是一个传奇!时至今日,它依旧灿烂. 一个程序员可以永远不用read/write,也可以不懂mmap,但必须懂fork.这是一种格调! fork没有参数,它是如此简单,是UNIX哲学的布道者或者说卫道者们的首选,它被写进了几乎每一本操作系统教科书里,成了 创建新进程的绝佳范式 ,fork站在原地,似乎在闭着眼睛蔑视 Windows的CreateProcess ,它的参数是如此之多,如此之复杂,在UNIX的世界,简单就是一切! 然而UNIX却不是整个世界

最诡异的Linux fork进程问题(我们平时都在写)

从来没有遇到过... 运行环境:在Linux自带的文本编辑器中输入C程序,在shell中编译运行,下面直接看代码和运行结果. 第一个代码:#include<stdio.h> #include<stdlib.h> #include<unistd.h> #define N 2 int main() { int i; pid_t pid; for(i = 0; i < N; i++) { pid = fork(); if(pid == 0) { printf("

linux fork函数与vfork函数

man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> #include <unistd.h> pid_t vfork(void); DESCRIPTION Standard description (From POSIX.1) The vfork() function has the same effect as fork(2), except

linux fork机制 转载

今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include "stdio.h" #include "sys/types.h" #include "unistd.h" int main() {     pid_t pid1;     pid_t pid2;     pid1 = fork();   

Linux fork exec等

http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html http://www.cnblogs.com/jimwind/archive/2012/12/26/2834147.html http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html Linux下一个进程在内存里有三部分的数据,就是"代码段"."堆

Linux fork()、exec() Hook Risk、Design-Principle In Multi-Threadeed Program

目录 1. Linux exec指令执行监控Hook方案 2. 在"Multi-Threadeed Program"环境中调用fork存在的风险 3. Fork When Multi-Threadeed Program的安全设计原则 4. Fork When Multi-Threadeed Program Deaklock Demo Code 1. Linux exec指令执行监控Hook方案 1. 基于LD_PRELOAD技术的glibc API劫持Hook技术 1) 优点: 位于R

linux: fork系统调用实现剖析

首先了解一下程序和进程的概念: 程序:程序是完成特定任务的一系列指令集合. 进程:从用户角度来看,进程是程序的一次执行过程.从系统的角度看,进程是操作系统分配内存和cpu等资源的基本单位,进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行状态,像unix这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程. 进程数据结构: 进程的静态描述:由pcb.有关程序段和该程序段所操作的数据结构集. 进程控制块:描述进程情况及控制运行所需要的全部信息 代码段:是进程

Linux Fork Bomb

众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能.这样的一款shell中自然不会缺少"函数"这个元素来帮助程序进行 模块化的高效开发与管理.于是产生了由于其特殊的特性,bash拥有了fork炸弹.Jaromil在2002年设计了最为精简的一个fork炸弹的实 现. 所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏.fork炸 弹实质是一个简单的递归程序.由于程序是递归的,如果没有任何限

Linux fork操作之后发生了什么?

今天我在阅读<Unix网络编程>时候遇到一个问题:accept返回时的connfd,是父子进程之间共享的?我当时很不理解,难道打开的文件描述符不是应该在父子进程间相互独立的吗?为什么是共享的呢?fork之后父子进程之间共享了什么?堆上的变量是否也共享了呢? 做了如下的代码测试,在fork之前先创建一个文件,在子进程中写入字符串“shenlei”,父进程读取文件内容,发现是“shenlei”.说明打开的文件描述符在父子进程之间是共享的. 看来在<Unix网络编程>中说的是对的,当cl