【问题标题】:New Process Creation in Operating System (Unix)操作系统(Unix)中的新进程创建
【发布时间】:2017-11-18 05:16:45
【问题描述】:

如果我的问题看起来很愚蠢,我很抱歉。我对操作系统中的新进程创建有疑问。考虑以下简单的 C 代码:

//hello.c
#include <stdio.h>

int main()

    {
        printf("Hello World\n");
        return 0;
    }

什么时候用 gcc 编译。

gcc hello.c

现在执行可执行文件 a.out

./a.out

现在我不明白在这种情况下如何创建New Process,谁调用fork()exec 系统调用和which process is duplicated 将a.out 作为子进程?在this example中,父进程显式调用fork系统调用来创建子进程,但在上面的hello.c代码中没有fork调用。

【问题讨论】:

  • shell 调用fork()。它复制自己,然后调用execv()在子进程中执行命令。
  • shell 调用fork 为你的程序创建一个进程在里面运行
  • @Aimal Linux 使用 COW(写时复制),所以 fork() 只复制几页,如果不是单页的话。
  • @Aimal,父级有10页,子级只会复制页表,它们都指向同一个框架。当他们中的一个人试图通过写作来改变时,我们就会重复。如果子进程发出execv(),则它不会复制任何内容,而是执行一个新程序,并在需要时将其页面复制到内存中。
  • 感谢@TonyTannous。

标签: c unix fork


【解决方案1】:

通常,父进程发出fork() 系统调用,创建一个具有(大部分)与原始进程相同的属性(例如不同的进程ID)的重复进程。从那里,子进程issues one of the exec family system calls 用新的进程映像替换它自己的进程映像。 This is explained quite well on the Unix SE.

在您的情况下,shell 是父进程,而您正在运行的“新程序”是最终调用 exec 的子进程。

【讨论】:

  • 如果可执行文件被双击,而不是通过 bash shell 调用怎么办?
  • @Aimal 那么父应用程序将是文件资源管理器或桌面管理器。它仍然做同样的事情:分叉和执行。
  • @Aimal 没有汗水。如果这充分回答了您的问题,请通过复选标记图标将其标记为“已接受”。
  • 知道了@DevNull。
【解决方案2】:

您的 shell 将为您的程序创建新进程并执行 exec。这意味着您的程序的父进程就是您的 shell。

echo $$ 这个命令将给出 shell 进程 ID。

程序:

printf("PPID : %d, PID : %d\n", getppid(), getpid() );

当你运行程序时,你会得到下面的输出。

PPID:19172,PID:26388

注意:

  Parent process and shell process ID's are same.   

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2018-06-23
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多