c-这个函数的输出总是一样的吗

  • 本文关键字:一样 函数 输出 c fork
  • 更新时间 :
  • 英文 :


我有以下一段代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int pid, status, number = 300; // Create a process (fork)
pid=fork();
if(pid==0) {
// Child process
number = 400;
printf("Child process: Number is %dn",number); // Terminate OK
exit(0);
} else {
// Father process
number = 500;
printf("Father process: Number is %dn",number); // Wait for child to finish
wait(&status);
}
return 0; // Terminate OK
}

我怀疑调度程序是否会影响这段代码的输出。我相信调度程序可能会先执行整个代码块,然后再执行另一个代码块,从而更改数字的值,并将两个线程中任何一个的打印更改为另一个线程的数字。

这是真的吗?或者结果是确定的,并且总是在它们各自的执行线程中输出400和500?

这不是多线程。fork()创建一个进程的副本。

当你运行程序时,操作系统会将其加载到内存中,创建一个进程并启动它。该进程(至少(使用一个包含代码的内存块和一个包含数据的内存块(注意:这并没有那么简单,但完整的解释超出了这个问题的范围(
代码段包含程序的代码,并且是只读的。数据段包含数据(变量(,其内容可以修改。

fork()系统调用创建一个新进程,该进程是原始进程的克隆。新进程使用与原始进程相同的代码段,但它有自己的数据段。数据段是原始数据段的克隆。

新进程不会从头开始运行代码,但其状态与父进程的状态相同;在创建之后,新进程就在fork()函数内部运行。

新进程独立于其父进程运行。在父进程中,函数fork()返回一个大于0(子进程的进程ID(的值。在子进程中,fork()返回0。通过这种方式,代码可以在父进程和子进程中继续处理不同的事情。

然后,这两个过程中的每一个都过着自己的生活,而不会影响另一个过程的生活。在您的示例中,父进程在其数据段中将number的值更改为400,然后打印它。此更改不会以任何方式影响子进程的number(或任何其他变量(的值;子进程有自己的数据段。子进程将其number的副本更改为500并打印它

由于这两个进程并行运行,因此无法确定两个显示值的顺序。在一次执行中可以是400,然后是500,在另一次执行时可以是相反的方式。

好吧,我们刚刚问了老师哈哈。内存空间完全不同,这意味着其他线程不应该影响打印输出。

最新更新