C编程子进程没有执行

时间:2014-10-15 02:02:00

标签: c fork

所以这是创建两个过程的简单程序:父和子。所以我所做的就是让父进程内的问候语和子进程内的名字。出于某种原因,我的子进程不打印,尽管我在父进程中调用了wait()。我该怎么办?

目标输出:“你好Sam” 输出我“M GETTING:”你好“

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    char *greeting = "Hello";
    char *name;


    pid_t pid;

    pid = fork();

    if(pid == 0)
    {
      name = "Sam";
      exit(0);
    }
    else if(pid == -1)
        printf("Fail\n");
    else{
      wait(0);
     printf("%s %s", greeting, name);
  }

} 

3 个答案:

答案 0 :(得分:3)

当您调用fork()时,子进程将收到父进程的地址空间(变量等)的副本。这意味着在子节点中,从父节点定义“名称”。但是,子进程中的“名称”只是一个副本。因此,在子进程中修改它不会影响父进程。

要获得我感觉到的行为,请将fork()替换为vfork()。出于本讨论的目的,唯一的区别是:

  1. 共享地址空间而不是复制地址空间。在子进程中编辑“name”将反映在父进程中
  2. 子进程执行时,父进程被挂起。我认为这没关系,因为你已经在父进程中调用了wait()
  3. 修改 我忘了补充一点,如果你去vfork路线,在子进程中将exit()更改为_exit()

答案 1 :(得分:0)

分叉后的子进程将独立于父进程运行。因此当你在孩子set name="Sam"时,它与printf在不同的程序中。所以你无法看到这条消息。

答案 2 :(得分:0)

在子流程中,您已分配到name,然后退出。

if(pid == 0)
{
  name = "Sam";
  exit(0);
}

printf("%s %s", greeting, name);行仅在else分支中执行,即父进程。它实际上是未定义的行为,因为name未被启用。