在“操作系统概念”-第9版-第3章-第117页-第120页中,它说:
两个进程(父进程和子进程)都会在fork()之后在指令处继续执行,但有一个区别:对于新的(子)进程,fork()的返回代码为零,而子进程的(非零)进程标识符则返回给父进程。 唯一的区别是子进程的pid值(进程标识符)为零,而父进程的值为大于零的整数值(实际上,它是子进程的实际pid )。
请有人给我解释一下这个概念。
发布于 2015-09-15 21:45:59
每当处理器(CPU)运行一个程序时,它都会存储它正在执行的代码的行号(更正式地说是指向该指令的地址),.The计算机将它存储在一个称为堆栈指针的寄存器(某种变量)中。因此堆栈指针(SP)将存储当前指令处理器必须执行(或运行)的指令。这样,计算机就可以跟踪应该执行哪些指令。
当程序运行时,它被分配给计算机主内存中的一些小内存。这里是我们所有的代码以及重要寄存器(包括SP)的位置,这些寄存器帮助处理器在running.Too时跟踪程序,进程ID(PID)是唯一标识进程的地方。
现在让我来回答你的问题。每当我们调用fork时,都会创建您调用fork的程序的副本。此副本称为“子进程”,我们的原始进程称为父进程。
当副本创建时,您的程序所分配的所有内存都被复制到内存中的其他地方(现在是子进程的内存),.So创建了一个相同的运行程序(进程)。
现在,复制的内存包含父进程的SP,因此每当处理器运行程序时,它都直接从同一分叉调用行(因为SP将在创建进程时将此行存储为当前指令).Since我们的分叉调用成功,它必须返回一个非负值(表示分叉系统调用的成功),因此它将0返回到子进程,子进程ID返回父进程(因为当前进程ID也指向这里)。
将子进程ID返回给父进程很好,因为父进程能够跟踪从it.Too返回子进程0创建的子进程更好,因为我们必须返回一个非负数,而其他正数可能是某个进程的PID。
在您的linux系统中运行cd /proc。所有具有某些数字名称的目录都是某个进程的pid (可能是活动/非活动的),.Read更多地使用它来清除这个概念。
希望这能消除你的疑虑。)
发布于 2015-09-14 04:08:36
当您在代码中调用叉时,它将返回两个值,如果调用成功,则返回两个值--一个用于父(由父运行的代码),一个用于子(由子运行的代码)。
int childparent;
childparent = fork();
if (childparent >=0)
{
if (childparent==0)
//child code
if (childparent>0)
//parent code
}句子中提到的pid 0不是shell命令ps显示的进程id。
编辑:是的,在父(如果是childparent>0)案例中运行的代码是在刚刚创建的特定子实例的上下文中运行的。因此,返回父进程的值是子进程ID (PID)。如果您在简单代码中分叉,并在足够运行ps的代码中睡眠很长时间,那么您可以匹配PS中显示的PID和父级中的printf ()的返回值(printf("%d",子父))
发布于 2015-09-15 22:04:03
fork()通过创建一个新流程,然后用当前流程填充它,从而生成当前流程的完整副本。它选择一个是父母,另一个是孩子。它仅通过调整fork()的返回值来表示差异。如果进程(Es)忽略返回值,则它们的行为相同。(在与信号处理和传递、用特殊属性打开的文件描述符、内存映射等相关的进程之间,很少有显著的其他差异。)
当你认为你开始理解它时,看看这,看看你是否理解它。
https://stackoverflow.com/questions/32557077
复制相似问题