所以这是创建两个过程的简单程序:父和子。所以我所做的就是让父进程内的问候语和子进程内的名字。出于某种原因,我的子进程不打印,尽管我在父进程中调用了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);
}
}
答案 0 :(得分:3)
当您调用fork()时,子进程将收到父进程的地址空间(变量等)的副本。这意味着在子节点中,从父节点定义“名称”。但是,子进程中的“名称”只是一个副本。因此,在子进程中修改它不会影响父进程。
要获得我感觉到的行为,请将fork()替换为vfork()。出于本讨论的目的,唯一的区别是:
修改强> 我忘了补充一点,如果你去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
未被启用。