使用fork:从父级访问子进程内存

Sat*_*l76 5 c memory arrays fork shared

我在C中使用fork()来分解运行本地数组的工作,让每个进程运行一半,然后将数组中每个点的数字相乘,然后将产品设置在第三个数组中.

pid_t  pid;
pid = fork();

if (pid == 0){
    for (i=1; i<((SIZE/2)+1); i++)
    {
        output[i] = (one[i] * two[i]);
    }
    exit(0);
}
else{
    wait(NULL);
        for (i=((SIZE/2)+1); i<(SIZE+1); i++)
        {
            output[i] = one[i]*two[i];
        }         
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在这段代码之后打印产品数组时,我只接收父进程设置的部分,我假设这是因为子进程将其值存储在父进程无法选择的内存中打印产品阵列时,但我不完全确定.在此先感谢您的帮助.

小智 7

看起来你的叉子与线程混淆了.

分叉复制整个过程.分叉并不像解雇一个线程(它是类似的,但线程共享进程内存,分叉复制进程内存).fork之后所做的更改不会在父级或子级之间共享.如果要在UNIX上共享父节点和子节点之间的内存,则fork()需要设置共享内存段并将该数组放入该内存中.如果你想坚持使用fork语义shmget,Lookup共享内存(,smctl).

forking有其用途,但它是一种较旧的传统多处理API,在大多数情况下已被多线程取代.分叉新进程比创建新线程要昂贵得多,即使fork在支持它的现代操作系统上进行了优化.可能最常见的用途fork()是创建一个守护进程(fork + parent exit)或执行一个命令(pipe + fork + exec),就像在popen()调用的实现中一样.

如果使用C,您应该查看pthreads API或其他支持系统线程的线程库.当然,看看你的预期任务,你仍然可以使用fork,但是一旦你掌握了线程,它就不会比使用带有共享内存的fork更复杂,除非你实现的算法很复杂.

  • 我是否可以添加分支新流程的另一个有用用法,就是您可以在自己的流程中运行可能存在错误的代码(可能是由于输入错误所致)或一些测试代码。这样可以保护主进程免于被SIGSEGV之类的信号杀死。父进程仍可以报告子状态(使用“ wait()”)。 (2认同)

Dox*_*ver 5

当您分叉时,新的子进程会获取父进程地址空间的副本。它是完全独立的。如果您需要在父级和子级之间进行通信,则需要使用管道、共享内存等。

注意:在任何现代 Linux 中,子级页表都指向父级的所有页,并且两个页表的条目都标记为“写入时复制”。因此,两个进程实际上都在查看相同的物理内存。然而,一旦任何一个进程尝试写入内存页面,它就会捕获并获取该页面的私有副本以进行修改。从进程的角度来看,它是相同的,只是 fork 的速度要快得多。