fork函数

fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid)。
还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。

//run in linux  程序会输出多少个'-'?
int main(void){
	int i;
	for(i = 0; i < 2; i++){
		 fork();
		 printf("-");
	}
	  return 0;
}

答:如果你对fork()的机制比较熟悉的话,这个题并不难,输出应该是6个“-”,但是,实际上这个程序会很tricky地输出8个“-”。

printf(“-”);把“-”放到了缓存中,并没有真正的输出,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。

那么我们把上面的程序改成下面这样:

时间: 2024-09-30 14:57:27

fork函数的相关文章

知识点查缺补漏贴02:Linux环境fork()函数详解

引言 先来看一段代码吧, #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { pid_t pid = fork(); if(pid < 0){ fprintf(stderr,"error!"); }else if(0 == pid){ fprintf(st

Linux多任务编程(二) fork()函数及其基础实验

fork()函数 在 Linux 中创建一个新进程的唯一方法是使用fork()函数.fork()函数是 Linux 系统中 一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何 解释?不着急,慢慢看. 函数说明 fork()函数用于从已存在的一个进程中创建一个新的进程 ,新进程称为子进程,而原进程称为父进程.使用fork()函数得到的子进程是父进程的一个复制品,它从父进 程处继承了整个进程的地址空间,包括进程上下文.代码段.进程堆栈.内存信息.打开的文

linux fork函数与vfork函数

一.fork1. 调用方法#include <sys/types.h>#include <unistd.h> pid_t fork(void);正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-1      子进程是父进程的一个拷贝.即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存:而对于只读的代码段,通常使用共享内存的方式访问.fork返回后,子进程和父进程都从调用fork函数返回处开始执行.     父进程与子进程的不同之处在于:fork的返

fork() 函数与 Linux 中的多线程编程

一.fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中 创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然 vfork()也可以创建进程,但是实际上其还是调用了fork()函数.fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返 回值,下面是fork()函数的声明: #inclu

fork函数总结

在Unix/Linux中用fork函数创建一个新的进程.进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程.该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程.两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID.子进程与父进程继续并发运行.如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定义关系的进程之间的一种层次关系. 程序包含位于内存的多个组成部分,执行程序的过程将根据需要来访问这些

浅谈Linux环境下并发编程中C语言fork()函数的使用_C 语言

由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

Linux中fork()函数实例分析_Linux

一.fork 入门知识  一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事.  一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.  我们来看一个例子: /* * fork_test.c * version 1

C语言的fork函数在Linux中的进程操作及相关面试题讲解_C 语言

fork的意义 下图为,C 程序的存储空间布局(典型) 1.一个现有进程可以调用 fork 函数创建一个新进程. 2.fork 函数被调用一次,但返回两次, 两次返回的唯一区别是子进程的返回值是 0, 而父进程的返回值是新子进程的 PID. 3.子进程和父进程继续执行 fork 调用之后的指令. 在上图的存储空间布局中,父子进程只共享正文段,其余的都各自有独立的副本 (通常使用 copy-on-write 的策略,速度比较快). fork 的两种用法 1.父子进程同时执行不同的代码段典型应用:W

Linux中使用C语言的fork()函数创建子进程的实例教程_C 语言

一.fork入门知识一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.   我们来看一个例子: #include <unistd.h> #include &l

【Linux】嵌入式开发,在Linux中使用C语言对Fork函数执行子函数及父函数,命令ps 及 ls 操作

<span style="font-family: Arial, Helvetica, sans-serif;">//fork.c</span> #include "sys/types.h" #include "unistd.h" #include "stdio.h" #include "stdlib.h" int main() { pid_t result; result=fork