首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C fork() -这段代码创建了多少个唯一的进程?

C fork()函数是一个创建子进程的系统调用,它会复制当前进程的副本并创建一个新的进程。在这段代码中,fork()函数被调用一次,但会返回两次。具体来说,它会返回0给子进程,返回子进程的进程ID给父进程。

因此,这段代码创建了两个唯一的进程:一个是父进程,另一个是子进程。父进程和子进程是通过进程ID来区分的,它们在执行过程中是相互独立的,拥有各自的内存空间和资源。

关于C fork()函数的更多信息,您可以参考以下链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux中fork()函数详解(原创!!实例讲解)

()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程几乎完全相同,将要执行下一条语句都是if(fpid<0)……     为什么两个进程fpid不同呢,这与...还有人可能疑惑为什么不是从#include处开始复制代码,这是因为fork是把进程当前情况拷贝一份,执行fork时,进程已经执行完了int count=0;fork只拷贝下一个要执行代码到新进程...二、fork进阶知识     先看一份代码: [cpp] view plaincopy /*  *  fork_test.c  *  version 2  *  Created on...)变量为i=0,fpid=0(fork函数在子进程中返回0),代码内容为: [c-sharp] view plaincopy for(i=0;i<2;i++){       pid_t fpid...();      fork() && fork() || fork();      fork();   return 0;   }       问题是不算main这个进程自身,程序到底创建了多少个进程

4K30

《理解 Unix 进程》笔记-1

规定了程序和计算机硬件直接所允许发生一切交互。 进程是 Unix 系统基石,所有的代码都是在进程中运行。 unix 中进程创建是通过内核系统调用 fork() 实现。...当一个进程产生一个 fork 请求时,操作系统执行以下功能: 为新进程进程表中分配一个空项 为子进程赋一个唯一进程标识符 为一个父进程上下文逻辑副本,不包括共享内存区 增加父进程拥有的所有文件计数器...文件描述符代表已打开资源,当资源没有被关闭时候,文件描述符编号会一直递增,那一个进程可以拥有多少个文件描述符呢?...子进程拥有自己唯一 pid 子进程ppid 就是调用 fork 进程 pid fork 调用时,子进程从父进程处继承了所有的文件描述符,也获得了父进程所有的文件描述符编号。...所以这段代码中,if 语句由子进程执行,而 else 语句由父进程执行。 考虑一个问题: 由于 fork 时候创建了一个和父进程一模一样进程,它包含了父进程在内存中一切内容。

88210

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

内核将每一个进程与一个唯一进程标识符,即pid(process identifier)关联在一起。 一个进程可以使用系统调用fork来创建一个新进程。...调用fork进程称为父进程fork建了一个新进程,称为子进程。子进程拥有与父进程完全相同内存内容。...\n",6); } 在这段代码执行末尾,文件描述符1所指文件将包含数据"hello world"。...管道右端可能也是一个带有管道命令(例如 a|b|c),它fork两个新进程(一个b,一个c)。...这段代码建了建了一个新文件,a与b都是该文件名称。 open("a",O_CREATE|O_WRONLY); link("a","b"); 对文件a进行读写就是对文件b进行读写。

58260

兆易创新嵌入式软件工程师笔试题目解析

2.下面代码建了多少个进程(不包含main进程本身)() int main(int argc,char* argv[]) { fork(); fork() && fork() || fork...fork调用一个奇妙之处在于它仅仅被调用一次,却能够返回两次,它可能有三种不同返回值: 1、在父进程中,fork返回新创建子进程进程ID。 2、在子进程中,fork返回0。...在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程进程ID。我们可以通过fork返回值来判断当前进程是子进程还是父进程。...有了上面的知识之后,下面我们来分析fork() && fork() || fork()会创建几个新进程。 ? 很明显fork() && fork() || fork()创建了4个新进程。...总结: 第一行fork生成1个新进程。 第二行三个fork生成4+4=8个新进程。 第三行fork会生成10个新进程(这是因为前面总共有10个进程,调用一次fork生成10个新进程

68630

题解5道c++面试题第一期(含解题思路、答案解析和实现代码)

,而通过代码我们能看到返回值多少取决于x什么时候变为0,而x值又取决于x&(x-1)这个表达式,在c++中有一个规则,凡是看到&或者|这样符号,那就把它左右两边值转换为二进制去计算,假设x是7,...下面代码一共产生多少个进程?...看下面这段代码: #include #include int main() { fork(); fork()&&fork()||fork...(); fork(); //while(1); return 0; } 这题关键有两点: 第一个是要清楚fork函数作用,fork函数是克隆出一个子进程,并且父进程返回子进程进程...ID,而子进程则返回0,并且在没有判断fork返回值时候,父子进程共享所有的代码; 第二是要知道符号&&和||用法,对于&&,如果它左边表达式值为真,则执行右边表达式

62820

Linuxfork使用

日常使用fork 简单来说, 一个进程调用 fork() 函数后,系统先给新进程分配资源,例如存储数据和代码空间。然后把原来进程所有值都复制到新进程中,只有少数值与原来进程值不同。...也就是说,资源复制是在需要写入时候才会进行,在此之前,只有以只读方式共享。 子进程是父进程一个复制品,可以简单认为父子进程代码一样。...{ //parent process } } } 无聊问题 1.下面的程序,不算 main这个进程自身,到底创建了多少个进程啊?...fork(); //2个 fork() && fork() || fork(); //A&&B||C //A为假,跳过B,判断C-----------------------2 //A为真,...判断B,若B为真,跳过C-----------1 //若B为假,判断C ------------2 fork(); //2 总共有: 2(2+1+2)2=20 不算自己的话有20-1=19个

3.6K41

2013年 腾讯笔试题:fork()

下面的程序一共输出多少个“-”?...();         printf("-\n");      }   return 0;   }   A.2 B.4 C.6 D.8 如果你对fork()机制比较熟悉的话,...要讲清这个题,我们首先需要知道fork()系统调用特性, fork()系统调用是Unix下以自身进程创建子进程系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程...还有一个很重要东西是,在fork()调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。...,这样我们可以用pstree查看一下进程树    return0;   }   于是,上面这段程序会输出下面的结果,(注:编译出可执行程序名为fork) 1 2 3 4 5 6

43110

聊聊Linux中线程和进程联系与区别!

在 Linux 中,每一个 task_struct 都需要被唯一标识,它 pid 就是唯一标识号。...pid_t pid; pid_t tgid; } 对于进程来说,这个 pid 就是我们平时常说进程 pid。 对于线程来说,我们假如一个进程下创建了多个线程出来。...3.3 进程线程创建异同 可见和创建进程时使用 fork 系统调用相比,创建线程 clone 系统调用几乎和 fork 差不多,也一样使用是内核里 do_fork 函数,最后走到 copy_process...这个代码很长,我对其进行了一定程度精简。...这里展开多说一句,对于内核任务来说,无论有多少个任务,其使用地址空间都是同一个。所以一般都叫内核线程,而不是内核进程。 五 结论 创建线程整个过程我们就介绍完了。

1.6K30

进程之间通信方式「建议收藏」

管道只能承载无格式字节流 信号 信号是进程之间唯一异步通信机制,信号主要来源主要有硬件来源(入键盘操作ctrl + C) 和软件来源(如kill命令),信号传递信息比较少,主要用于通知进程某个时间已经发生...共享内存 共享内存就是映射一段能被进程之间共享内存,这段内存由一个进程创建,但是多个进程都可以共享访问,是最快一种进程间通信方式(不需要从用户态到内核态切换),它是针对其他进程间通信方式运行效率低而专门设计...我们可以使用 fork 创建子进程,创建进程会复制父进程文件描述符,这样就做到了两个进程各有两个「 fd[0] 与 fd[1]」,两个进程就可以通过各自 fd 写入和读取同一个管道文件实现跨进程通信了...我们可以得知,对于匿名管道,它通信范围是存在父子关系进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信目的。...另外,对于命名管道,它可以在不相关进程间也能相互通信。因为命令管道,提前创建了一个类型为管道设备文件,在进程里只要使用这个设备文件,就可以相互通信。

58820

一道FORK面试

这个题是这样: 题目:请问下面的程序一共输出多少个“-”?...要讲清这个题,我们首先需要知道fork()系统调用特性, fork()系统调用是Unix下以自身进程创建子进程系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程...还有一个很重要东西是,在fork()调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。...所以,上面的那个程序为什么会输入8个“-”,这是因为printf(“-“);语句有buffer,所以,对于上述程序,printf(“-“);把“-”放到了缓存中,并没有真正输出(参看《C语言迷题》中第一题...return 0; } 于是,上面这段程序会输出下面的结果,(注:编译出可执行程序名为fork) ppid=8858, pid=8518, i=0 ppid=8858, pid=8518,

69510

Fork三部曲之clone诞生

一个处理器未必处理特定进程。 系统中进程数量和处理器数量不需要相等。 fork为上述核心思想提供了实现手段。后来fork被引入到UNIX系统,成了创建新进程几十年不变通用操作。...以上这段简单代码,请问,用WindowsCreateProcess API如何实现?...并行多处理,多线程共享资源替代了昂贵IPC。 作为多进程优化或者说替代,多线程本质和fork原始意义看起来并无太大分歧。唯一区别似乎就是资源共享深度不同。...clone之后,就创建了一个线程。线程执行func之后便退出了。问题是,线程是如何退出呢?...对于普通C程序,我们知道main函数返回到了C库,而C库在main返回后会调用exit退出程序,而对于多线程程序,在编译代码时候,我们显式链接了libpthread,那么类似C事情在多线程程序里就

87420

进程和线程(上)

,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正并行执行多任务只有在多核 CPU 上才可以实现,单核 CPU 系统中,真正并发是不可能,因为在某个时刻能够获得CPU只有唯一一个线程...多进程 在 Unix/Linux 系统中,提供了一个 fork() 系统调用,它是一个特殊函数,普通函数调用是调用一次,返回一次,但 fork 函数调用一次,返回两次,因为调用该函数是父进程,然后复制出一份子进程了...Python 中 os 模块封装了常见系统调用,这就包括了 fork代码示例如下: import os print('Process (%s) start...' % os.getpid())...Pool 上述例子是开启了两个进程,但如果需要开启大量进程,上述代码写法就不合适了,应该采用进程方式批量创建子进程,还是用下载文件例子,但执行下部分代码如下所示: import os from...(end - start)) if __name__ == '__main__': download_multiprocess_pool() 代码中 Pool 对象先创建了 5 个进程,然后

72410

进程和线程(上)

,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正并行执行多任务只有在多核 CPU 上才可以实现,单核 CPU 系统中,真正并发是不可能,因为在某个时刻能够获得CPU只有唯一一个线程...多进程 在 Unix/Linux 系统中,提供了一个 fork() 系统调用,它是一个特殊函数,普通函数调用是调用一次,返回一次,但 fork 函数调用一次,返回两次,因为调用该函数是父进程,然后复制出一份子进程了...Python 中 os 模块封装了常见系统调用,这就包括了 fork代码示例如下: import os print('Process (%s) start...' % os.getpid())...Pool 上述例子是开启了两个进程,但如果需要开启大量进程,上述代码写法就不合适了,应该采用进程方式批量创建子进程,还是用下载文件例子,但执行下部分代码如下所示: import os from...(end - start)) if __name__ == '__main__': download_multiprocess_pool() 代码中 Pool 对象先创建了 5 个进程,然后

61010

Linux下创建新进程

总结一下:fork函数创建进程是父进程复制,子进程和父进程并发执行来段代码测试一下。...printf("pid is %d\n",getpid()); //获取进程pid if (0 < pid) //父进程得到pid大于0,这段代码是父进程中执行...,num is %d\n",num); } else if(0 == pid) //子进程得到返回值是0,这段代码在子进程中执行 { num--;...从运行结果可以看到,父子进程PID是不同,说明我们确实创建了一个进程。另外父子进程变量是独立,这也说明了子进程是父进程复制。当然,这样带来坏处是进程通信必须使用专门通信机制。...此处使用if-else语句才能真正使得创建一个新进程有意义,否则父子进程将会执行一模一样代码,这没有意义。

2.1K10

明明还有大量内存,为啥报错“无法分配内存”?

这里直接和大家汇报结论,前面关于 numa 内存不足猜测是错误。真实原因是上面第 3 个,这台服务器上面的某几个java进程建了太多线程,导致了这个报错产生,并不真的是内存不够。...1.1 do_fork 剖析 在 Linux 内核里,无论是创建进程还是线程,都会调用到最核心 do_fork 上来。在这个函数内部,通过拷贝方式来创建新进程(线程)所需要内核数据对象。...//file:kernel/fork.c long do_fork(unsigned long clone_flags, ...) { //所谓创建,其实是根据当前进程进行拷贝 //注意:倒数第二个参数传入是...io_context) exit_io_context(p); ...... fork_out: return ERR_PTR(retval); } 通过以上代码可以看出,Linux 内核创建整个进程内核对象创建过程都是通过分别调用不同...大家注意这段代码细节:无论 alloc_pid 返回是何种类型失败,其错误类型都写死返回 -ENOMEM。。。 为了方便大家理解,我单独把这段逻辑再展示一遍。

1.7K20

for循环+fork-join_none结构坑,你有注意到吗?

aa( ); join 如上代码,我们想要并行执行100个 aa( )这个函数进程。...好像差不多理解了:for循环时候依次创建了10个进程,然后等for循环结束后,才并行执行10个fork进程。...(“No%0d,My face_grade is %0d”, j ,j ); join_none f 这段代码打印正是我们期望: No0,My face_grade is 0 No1,My face_grade...简单说,如果把我们这段代码理解为两个过程:“创建进程”、“执行进程”。 创建进程时候,创建10个并行进程,然后统一执行。...各位初学者可以这样简单理解这段代码,但是其实呢要更进一步探究就涉及到了 sv仿真调度机制!!! 先简单看一眼,就是这些个东西啦: ? 我擦,短短几句代码需要想到这么多知识吗?

1.4K30

吐槽一下 Python 混乱 multiprocessing 和 threading

这是因为 fork 之后, 唯一线程自动成为了 main thread, 而 Python 中硬编码了 main thread 不是 daemon thread, 所以这个线程不会退出....而使用 spawn 调用创建进程会通过 sys.exit() 退出, 也就避免了这个 bug 影响. 而使用 fork 创建进程依然受到这个 bug 影响...._shutdown 调用, 也就是会 join 其他 thread. fork vs spawn 造成 OS 平台差异性 我们知道, 在 *nix 系统中创建一个一个新进程可以使用系统调用 fork...如果要执行一个新程序, 必须在 fork 之后调用 exec* 家族系统调用, 后来 Linux 中添加了 spawn 系统调用, spawn 和 fork 不同是, 他是从头创建了一个新子程序...asyncio.get_event_loop() asyncio.ensure_future(coro(loop), loop=loop) loop.run_forever() loop.close() 这段代码看起来没有什么问题

72610

【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)

返回不同返回值,是为了 区分 为了让fork以后if判断while等,来让父子进程执行 不同 代码片段 4.为什么fork要给子进程返回0,给父进程返回子进程pid?...父进程要标记子进程,确保其 唯一性 5.fork函数究竟在干什么?...————>父子进程共享代码段,各自拥有数据段(写时拷贝) 进程=内核数据结构+代码和数据 多了一个子进程,说明内存中一定会多出一个PCB供操作系统调度 fork出来进程,和父进程 共享同一个代码...单独开空间用多少,拷贝多少,进行了写时拷贝 父子进程共享代码段现象:fork以后代码执行了两次 先不调用fork函数,观察这段代码执行结果 代码正常执行一次 调用fork()以后: 我们发现fork...——>父子进程共享return代码fork是一个函数, return语句 也属于 代码片段 从5小点我们知道 父子进程共享代码段 ,于是有了以下过程

69110

Fork炸弹简析和应对方法

但其实这个代码思路非常简单,就是递归开一个新进程,不断开不断开,直到操作系统崩溃。中招后唯一解决办法就是拔电源重启。 作为长期写C语言我们来说,看这段代码有一个很大坎,就是标识符。...稍微清楚写法是: bomb(){ bomb|bomb& }; bomb 这样就清楚很多了,也就没啥神秘了。 后果 这段代码执行后果不用说,就是电脑死机。...死机原因就类似DDoS攻击一样,系统忙于处理这个垃圾程序生成垃圾进程而无法分配给我们需要执行程序。所以,一般没事做的话不要跑这个代码(话说我就无聊跑了两遍)。...预防 预防fork命令方法也很清楚,就是限制系统最大进程数,这样就算运行了也不会死机了,就留给我们杀掉这个进程机会了。...在这里我们可以通过ulimit命令来查看系统定义最大进程数: myths@myths-X450LD:~$ ulimit -a core file size (blocks, -c)

57530

【Linux修炼】11.进程创建、终止、等待、程序替换

如何理解fork返回之后,给父进程返回子进程pid,给子进程返回0? 父亲:孩子 = 1:n, n>=1,因此孩子找父亲具有唯一性。...参数: 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL 了解了关于wait信息之后,就试着使用一下wait() 这段代码目的是想演示僵尸状态下进程被回收结果: 即子进程先在循环中...那么这段代码我们编辑完成之后赋值ssh渠道进行观察进程状态: 一开始右侧执行脚本,观察状态,同时左侧运行mytest,我们发现当子进程正在执行时,子进程和父进程都处于S+状态,当子进程执行完毕,没有被父进程回收时那...对于阻塞等待,我们上面已经演示过,那么下面就直接上非阻塞状态过程: 对于这段代码,设计理念是这样:子进程在执行期间,父进程则会一直等待并通过while方式去轮询非阻塞状态,直到子进程退出。...顾名思义我们在C语言中scanf以及printf类函数,无论传入多少个参数都没有限制,实际上就是可变参数列表作用,因此,excel里可变参数列表作用就是让我们能在传入选项参数时能够传入任意数量选项

6.1K00
领券