执行(cd 和 ls)和 Fork 调用 C

Exec (cd and ls) and Fork call C

我正在尝试用 exec() 和 fork() 做一个简单的例子。但是我有一个小问题,我不明白如何解决它。

该代码进行了 3 次分叉,并且在每个 child 中它调用了一个 exec。第一个系统调用是 "who",在 "cd" 和 "ls -ls" 之后。我的问题是:在调用 "cd" 之后,"ls" 调用不显示当前目录中的文件。所以,如果我有 'dir1/dir2',我会做 "cd",但是当我做 "ls" 时,程序会显示 'dir/dir2' 中的文件。

一个 child 可以访问另一个 child 所做的更改吗?

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++;
    }

The first system call is "who"

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

不幸的是,您没有看到 cd 的执行失败,因为您没有检查 execlp 的错误。检查 exec 的 return 值并处理这些错误,事情将开始变得更加清晰。

您不能使用 execlp 到 运行 命令 cd,这是一个 shell 内置命令,如果您是,则应该调用 chdir在 Linux 上更改进程的当前工作目录。

int chdir(const char *path);

还要检查 execlp 的 return 值:

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
}