2016-04-28 122 views
1

我想用exec()和fork()做一个简单的例子。但我有一个小问题,我不明白如何解决它。Exec(cd和ls)和Fork调用C

该代码确实有3个分支,并且在每个孩子中它都会调用一个exec。第一个系统调用是“谁”,在“cd”和“ls -ls”之后。我的问题是:在制作“cd”后,“ls”调用不会显示当前目录中的文件。所以,如果我有'dir1/dir2',我会做'cd',但是当我做'ls'时,程序显示'dir/dir2'中的文件。

可能有一个孩子访问另一个孩子所做的更改吗?

while (cont_arg < 3) { 
     pid_t pid = fork(); 
     if (pid == -1) { 
      perror("fork failed"); 
      exit(EXIT_FAILURE); 
     } else if (pid == 0) { 
      printf("\n---: child process ID -> %d.\n", getpid()); 
      printf("command --- > %s\n", command[cont_arg]); 
      execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
      _exit(EXIT_SUCCESS); 
     } else { 
      wait(&status); 
     } 
     cont_arg++; 
    } 

回答

1

不能使用execlp运行命令cd,这是一个shell内置命令,而不是你应该叫chdir,如果你是在Linux上,要改变你的进程的当前工作目录。

int chdir(const char *path); 

同时检查的execlp返回值:

int ret = execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL); 
if (ret < 0) { 
    fprintf(stderr, "exec failed for %s\n", command[cont_arg]); 
    exit(EXIT_SUCCESS); // will reach here only if exec failed 
} 
+0

非常感谢!我使用了chdir,它工作。 –

+0

最后一个问题,当我使用chdir时,我会将当前目录更改为将来可以使用fork创建的子目录,或者只更改当前子目录? –

+0

@GabrielaCavalcante通过fork(2)创建的子进程继承其父进程的当前工作目录。所以是的,所有的孩子都会有变化的。 – fluter

1

第一个系统调用是 “谁”

不,这些都不是系统调用。术语“系统调用”用于完全不同的事物。 whols是您使用exec执行的程序。另一方面是cd是一个shell命令。所以执行cd,即使你做得正确也不会有任何效果。由于cd只是告诉shell进程更改其内部状态,该状态仅对shell及其子进程可见。

不幸的是,你看不到cd的执行失败,因为你不检查execlp的错误。检查exec的返回值并处理这些错误,事情就会开始变得更加清晰。

+0

谢谢!老师们对此没有很好的解释,我会试着找一些关于这个问题的书。 –