我正在尝试理解fork()和处理地址空间。我写了一个基本的概念证明程序,它派生出一个新进程并更改新进程中的一个变量。我的期望是,当我更改孩子中的变量时,这应该会导致该变量获得新地址。如果我理解正确,Linux 会使用 fork 进行写时复制。所以我希望父级和子级中的变量地址匹配,直到我在其中之一中更改它。那么我希望他们会有所不同。然而,这不是我所看到的。
这是因为写时复制从物理内存中分配了一个新页面,但进程地址空间没有改变 - 只是由 TLB 重新映射到新页面?还是我不理解这一点或在我的程序中犯了转储错误?
概念验证代码:
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void describe(const std::string &descr, const int &data) {
pid_t ppid = getppid();
pid_t pid = getpid();
std::cout << "In " << descr << ":\n"
<< "Parent Process ID: " << ppid
<< "\nMy Process ID: " << pid
<< "\nValue of data: " << data
<< "\nAddress of data: " << &data << "\n\n";
}
void change(int &data) …Run Code Online (Sandbox Code Playgroud) 我了解到设置非零值/proc/sys/kernel/sched_child_runs_first会强制子进程在父进程之前运行.但是,我认为它似乎不起作用.这是我的代码:
#include <stdio.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
pid_t child_pid;
switch(child_pid = fork())
{
case 0:
printf("In Child\n");
exit(0);
case -1:
printf("Could not fork()\n");
default:
printf("In parent\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出总是:
In parent
In Child
Run Code Online (Sandbox Code Playgroud)
我在这里想错了吗?
PS:我只是在试验它是否有效,所以请不要建议其他同步机制或为什么这是一个坏主意等.
我正在练习使用并行编程fork().我希望每个进程的父ID都是前进程的id,但在我的输出中显示相同的id.为什么?第二个问题是关于终止.有时输出显示所有进程,有时只有两个或三个,有时只有一个.为什么?我知道父母的过程应该等待它的孩子,但如果不是在我的问题中.我的困惑是,在fork()调用时,两个进程都是在不知道命令的情况下执行的,不是吗?也许父进程终止自己的执行.但它的孩子可以继续跑步到其余的节目或终止或其他什么?(因为它可以在输出上看到并不总是终止,也不总是完全正确)我不理解输出只显示一个但有时两个或三个或不是全部.我希望我能解释一下我的问题.看来,我做不到.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i;
for (i = 0; i < 3; i++)
if (childpid = fork())
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(S):
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:1 child ID:2785
i:2 process ID:2785 parent ID:1 child ID:2786 …Run Code Online (Sandbox Code Playgroud)