以下代码永无止境。这是为什么?

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#define SIZE 5
int nums[SIZE] = {0, 1, 2, 3, 4};
int main()
{
  int i;
  pid_t pid;
  pid = vfork();
  if(pid == 0){  /* Child process */
    for(i = 0; i < SIZE; i++){
      nums[i] *= -i;
      printf(”CHILD: %d “, nums[i]);    /* LINE X */
    }
  }
  else if (pid > 0){  /* Parent process */
    wait(NULL);
    for(i = 0; i < SIZE; i++)
      printf(”PARENT: %d “, nums[i]);   /* LINE Y */
  }
  return 0;
}

更新:

这段代码只是为了说明我对vfork()的一些困惑。好像当我使用vfork()时,子进程不会复制父进程的地址空间。而是共享地址空间。在那种情况下,我希望nums数组都能被两个进程更新,我的问题是按什么顺序?操作系统如何在两者之间进行同步?

至于为什么代码永无休止,可能是因为我没有明确的退出_exit()exec()语句。我对吗?

UPDATE2:
我刚读:56. Difference between the fork() and vfork() system call?
我认为这篇文章对我的第一次困惑有所帮助。

最佳答案

不要使用vfork。这是您可以获得的最简单的建议。 vfork给您的唯一一件事就是暂停父级,直到子级调用exec*_exit为止。关于共享地址空间的部分是不正确的,某些操作系统则这样做,而另一些则选择不这样做,因为它非常不安全并且已导致严重的错误。

上次我查看了应用程序实际上如何使用vfork时,绝对多数错误了。太糟糕了,我放弃了6个字符的更改,从而无法在当时正在使用的操作系统上共享地址空间。几乎所有使用vfork的人至少都会泄漏内存,如果不是更糟的话。

如果您真的想使用vfork,除了在子进程返回后立即调用_exitexecve,不要做任何其他事情。除此之外,您正在输入未定义的区域。我的意思是“任何东西”。您开始解析您的字符串以为exec调用做参数,并且可以完全保证某些东西会碰到本不该碰的东西。我的意思是execve,而不是exec系列的其他功能。许多libc都在execvpexeclexecle等中执行在vfork上下文中不安全的操作。

您的示例中具体发生了什么:

关于c - vfork永无止境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14480053/

10-11 20:33