Exec(cd和ls)和Fork调用C
我想用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++;
}
不能使用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
}
第一个系统调用是 “谁”
不,这些都不是系统调用。术语“系统调用”用于完全不同的事物。 who
和ls
是您使用exec执行的程序。另一方面是cd
是一个shell命令。所以执行cd
,即使你做得正确也不会有任何效果。由于cd
只是告诉shell进程更改其内部状态,该状态仅对shell及其子进程可见。
不幸的是,你看不到cd
的执行失败,因为你不检查execlp
的错误。检查exec的返回值并处理这些错误,事情就会开始变得更加清晰。
谢谢!老师们对此没有很好的解释,我会试着找一些关于这个问题的书。 –
非常感谢!我使用了chdir,它工作。 –
最后一个问题,当我使用chdir时,我会将当前目录更改为将来可以使用fork创建的子目录,或者只更改当前子目录? –
@GabrielaCavalcante通过fork(2)创建的子进程继承其父进程的当前工作目录。所以是的,所有的孩子都会有变化的。 – fluter