1

我正在制作一个命令 shell,我正在使用孩子来更改 shell 的目录,但我无法让它更改数组的内容;

最后它只打印当前目录而不是“/”。孩子对 newDirectory 数组没有影响。我究竟做错了什么?有没有办法让孩子改变数组的内容?谢谢。

char newDirectory[255];

getcwd(newDirectory, 255); //set newDirectory to current directory

pid_t pid;      

pid = fork();

if(pid == 0){   //child execution       

    strcpy(newDirectory, "/");

    exit(0);
}

else if (pid < 0){                  
    printf( "Error!\n");    
    exit(1);
}
else{                       
     pid = waitpid(pid, NULL, 0);   
}
printf("%s\n", newDirectory);
chdir(newDirectory);
4

2 回答 2

2

(从评论移动)

当您执行fork()新进程时,新进程是父进程的独立副本1,因此您对子进程的变量所做的任何更改都不会从父进程中看到 - 它们有两个独立的虚拟地址空间。

如果您希望子进程与父进程通信,您必须使用一些 IPC 方法(例如管道、共享内存、套接字……)。


  1. 实际上,在现代系统上,地址空间复制实际上是通过写时复制来实现的,但这并没有改变这一点。
于 2013-02-23T21:43:50.557 回答
0

最简单的解决方案是不使用子进程更改当前工作目录(因为当前工作目录只会在子进程中更改,而不是父进程,如 Matteo 所述)。

如果您检查现有的 shell(例如bash或什至sh),您会注意到某些命令被认为是“内置的”并且cd是这样的命令之一。

于 2013-02-24T06:16:19.230 回答