繁体   English   中英

C编程子进程未执行

[英]C programming child process is not executing

因此,这是创建两个过程的简单程序:父级和子级。 所以我要做的是在父进程内部有问候语,在子进程内部有名字。 由于某种原因,尽管我在父级内部调用了wait(),但子级进程仍无法打印。 我该怎么办?

目标输出:“ Hello Sam”,输出I“ M GETTING:“ Hello”

#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);
  }

} 

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

要获得我感觉到的行为,请用vfork()替换fork()。 在此讨论中,唯一的区别是:

  1. 地址空间是共享的,而不是复制的。 在子进程中编辑“名称”将反映在父进程中
  2. 子进程执行时,父进程被挂起。 我认为这是可以的,因为您已经在父进程中调用了wait()

编辑:我忘了补充,如果您走了vfork路线,则在子进程中将exit()更改为_exit()

一旦分叉的子进程将独立于父进程运行。 因此,当您在子级中set name="Sam" ,它位于与printf不同的程序中。 因此您看不到该消息。

在子进程中,您分配了name ,然后退出。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM