Exec(cd和ls)和Fork调用C.

时间:2016-04-28 08:00:12

标签: c linux fork exec system-calls

我正在尝试用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++;
    }

2 个答案:

答案 0 :(得分:2)

  

第一个系统调用是&#34;谁&#34;

不,那些不是系统调用。术语&#34;系统调用&#34;用于完全不同的东西。 whols是您使用exec执行的程序。另一方面,cd是一个shell命令。所以执行cd,即使你正确地执行它也不会有任何影响。因为cd只是告诉shell进程改变其内部状态,只有shell及其子进程可见。

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

答案 1 :(得分:2)

你不能使用/usr/local/bin/php /home/username/public_html/cron.php 来运行命令execlp,这是一个shell内置命令,如果你在Linux上,你应该调用cd来改变当前的工作目录你的过程。

chdir

同时检查int chdir(const char *path); 的返回值:

execlp