相关疑难解决方法(0)

为什么不解决分叉过程中的变化?

我正在尝试理解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)

c c++ linux fork virtual-memory

16
推荐指数
1
解决办法
477
查看次数

/ proc/sys/kernel/sched_child_runs_first有效吗?

我了解到设置非零值/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:我只是在试验它是否有效,所以请不要建议其他同步机制或为什么这是一个坏主意等.

c linux linux-kernel

5
推荐指数
1
解决办法
1830
查看次数

fork()中的父ID和提前终止

我正在练习使用并行编程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)

c parallel-processing posix fork

2
推荐指数
1
解决办法
314
查看次数