【问题标题】:Exec (cd and ls) and Fork call C [duplicate]Exec(cd 和 ls)和 Fork 调用 C [重复]
【发布时间】:2016-04-28 08:00:11
【问题描述】:

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

代码执行了 3 个分叉,并且在每个子节点中调用了一个 exec。第一个系统调用是“who”,在“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++;
    }

【问题讨论】:

    标签: c linux fork exec system-calls


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 非常感谢!我使用了 chdir,它起作用了。
    • 最后一个问题,当我使用 chdir 时,我会将当前目录更改为我可以使用 fork 创建的未来子目录还是只是当前子目录的目录?
    • @GabrielaCavalcante 通过 fork(2) 创建的子进程继承其父进程的当前工作目录。所以是的,所有的孩子都会有一个改变的。
    【解决方案2】:

    第一个系统调用是“who”

    不,那些不是系统调用。术语“系统调用”用于完全不同的东西。 whols 是您使用 exec 执行的程序。另一方面,cd 是一个 shell 命令。所以执行cd,即使你做对了也不会有任何效果。因为cd只是告诉shell进程改变它的内部状态,这个状态只对shell及其子进程可见。

    很遗憾,您没有看到 cd 的 exec 失败,因为您没有检查 execlp 的错误。检查 exec 的返回值并处理这些错误,事情就会开始变得更加清晰。

    【讨论】:

    • 谢谢!老师解释的不是很好,我会试着找一些这方面的书。
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 2015-12-01
    • 2013-05-06
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多