执行(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" 用于完全不同的事物。 who
和 ls
是您使用 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
}
我正在尝试用 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" 用于完全不同的事物。 who
和 ls
是您使用 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
}