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

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

这段代码创建了一个唯一的进程

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork error");
        return 1;
    }
    return 0;
}

在这段代码中,fork() 函数被调用一次,创建了一个新的进程。fork() 函数返回两次:一次在父进程中,返回值为子进程的 PID(进程 ID);一次在子进程中,返回值为 0。通过检查 fork() 的返回值,可以确定当前代码是在父进程中运行还是在子进程中运行。

所以,这段代码创建了一个唯一的进程。

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

相关·内容

《理解 Unix 进程》笔记-1

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

91510

操作系统不挂科】<创建线程(7)>单选&多选&简答题(带答案与解析)

在支持多线程的系统中,进程P创建的若干线程不能共享的是( ) A. 进程P的代码段 B. 进程P中打开的文件 C. 进程P的全局变量 D....进程P中某线程的栈指针 正确答案:D 二.多选题 2. 在同一进程的多线程之间,下列哪些程序状态部分会被共享( ) A. 寄存器 B. 堆 C. 全局变量 D....堆栈 正确答案:BC 堆内存是进程中的一块共享区域 堆栈(通常指线程栈)是每个线程私有的内存区域 三.简答题 1.考虑下面的代码段:回答 1.创建了多少个单独进程? 2.创建了多少个单独线程?...正确答案: 创建了6个单独进程 创建了2个单独线程 2.如图所示的程序采用Pthreads API。该程序的LINE C和LINE P的输出分别是什么?...正确答案: LINE C:5 LINE P:0 fork创建一个原进程的内存副本,只是内容一样。一旦,对应功能区信息改变改变(如数据段、代码段),则各自有私有的物理内存,不会共享

5500
  • 【操作系统不挂科】<创建进程(5)>选择题&分析填空题(带答案与解析)

    进程>选择题 1.以下关于父进程和子进程的叙述中,正确的是( ) A.父进程创建了子进程,因此父进程运行完了,子进程才能运行 B.父进程和子进程可以并发执行 C.撤销子进程时,应该同时撤销父进程...(多选题) A.堆栈 B.堆 C.共享内存段 D.代码段 正确答案:D fork共享代码段 数据段、堆和栈:尽管子进程在创建时会得到父进程数据段、堆和栈的副本,但这些副本在物理内存中是分开的。...相关解释跳转下方传送门 一个fork的面试题 2.采用下列的程序,说明第A行的输出结果 正确答案:PARENT:value=5 fork共享代码段,不共享数据段;全局变量value在数据段,不受影响 3...正确答案:8 2的三次方 4.如下图程序所示的程序创建了多少个进程(包括初始的父进程)?...(假定父进程和子进程的pid分别为2600和2603) 正确答案: A:pid=0; //fork后子进程返回0 B:pid1=2603; //getpid()获取当前进程的ID C:pid=2603

    6610

    【翻译】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进行读写。

    60760

    Linux实验六:进程间通信(二)

    编辑源代码test6.c 源代码test6.c内容见上述参考代码。...mkdir test6 cd test6 vim test6.c 这段代码是一个简单的父子进程间通信的例子,使用了Linux系统调用中的管道(pipe)和进程创建(fork)。...调用fork函数创建子进程。如果fork返回值为0,表示当前代码正在子进程中执行;如果大于0,表示当前代码正在父进程中执行;如果返回-1,表示创建进程失败。...在父进程中调用waitpid函数等待子进程退出。 父子进程均关闭了管道的相应端口,并退出程序。 这段代码实现了父子进程间的单向通信,父进程向子进程写入数据,子进程读取并打印收到的数据。...在这个例子中,通过fork函数创建了一个子进程,子进程和父进程共享了文件描述符表,但各自有独立的内存空间,因此可以通过管道进行通信。   在实验过程中,我也遇到了一些问题。

    4310

    【Linux】进程概念

    什么是进程? 进程是操作系统中的一个基本概念,它是正在运行的程序的实例。进程不仅仅是代码,还包括代码执行时所需的资源和状态信息。...ps ajx | head -1 && ps ajx | grep myexe 这段指令就可以使得查看指定进程的同时顺便加上头部信息了。...可以看见,这里的头部信息有很多,pid就是我们所说的标识符,标识符具有唯一性,可以唯一的确定一个进程,意思就是我们可以通过标识符来查找进程。...第一种方式:Ctrl+c 第二种方式:kill+进程标识符 这两种方式都可以结束进程。 我们已经知道了bash会创建一个子进程来执行我们的命令,那么我们该如何手动创建一个子进程呢?...因为这里创建了一个子进程,子进程和父进程共享同一份代码,但是数据是私有的,所以会产生这样的结果,我们来验证一下是不是。

    9910

    题解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返回值的时候,父子进程共享所有的代码; 第二是要知道符号&&和||的用法,对于&&,如果它左边的表达式值为真,则执行右边的表达式

    66220

    Linux系统编程:理解进程进程管理

    ----管理一个对象我们还是遵循以往的套路:先组织,再描述; 二,简单理解进程管理 2.1描述进程 我们写好的C/C++程序保存在磁盘上,当我们要使用的时候,OS会将此程序的代码和数据加载到内存中,而这个时候其实就可以叫做是一个进程块了...(有点类似学校里每个学生的学号,是一个唯一标识,方便我们通过标示符来管理进程) 2、状态: 任务状态,退出代码,退出信号等。...,因此就需要拿到子进程的PID(标识子进程的唯一性); 6.3fork函数究竟干了什么?...fork进程创建了一个子进程->进程=内核数据结构+数据和代码块; ->创建一个task_struct结构体用于描述子进程; ->子进程中的代码块数据指针指向的地址与父进程的该指针相同(父子进程的代码是共享的...我们现在分析一下fork函数-> 我们知道fork函数是拷贝父进程的代码和数据,创建一个新的task_struct,所以这里就有了先后顺序问题; 是先执行完函数返回值之后才创建好了子进程还是在返回值之前就创还能好了子进程呢

    5100

    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

    44410

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

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

    1.6K20

    一道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,

    72010

    C语言进程(第一章进程基础,fork()函数,pid_t, pid, getpid())

    在C语言中,可以使用这个函数来创建新进程。 具体地说,当程序执行到 fork()函数时,它会创建一个子进程并使其运行同样的代码,相当于将原来的进程“复制”一份,形成了两个几乎完全相同的进程。...,我的pid是 %d \n", getpid()); } return 0; } 在这个例子里,调用fork()函数创建了一个子进程。...进程 ID 在系统内部用作识别进程、管理进程状态等方面起着非常重要的作用,这意味着唯一的PID意味着对应唯一的进程标识符。...在 C 标准库 中,fork() 函数说明返回一个 pid_t 类型的值,从而方便地获得新创建进程的 PID 号,示例代码如下: #include #include...这有助于让您的代码更符合 C 标准,并以可移植方式使用操作系统提供的功能。

    11210

    Fork三部曲之clone的诞生

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

    92720

    进程和线程(上)

    ,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正的并行执行多任务只有在多核 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 个进程,然后

    74710

    进程和线程(上)

    ,每个进程又启动多个线程,但这种方法非常复杂,实际很少使用 注意:真正的并行执行多任务只有在多核 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 个进程,然后

    63310

    Linux下创建新进程

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

    2.1K10

    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这个进程自身,程序到底创建了多少个进程

    4.1K30

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

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

    2.3K31

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

    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个新进程。

    75530

    Linux的fork使用

    日常使用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.7K41
    领券