这是我的教授给我的描述:
编写一个C(不是C ++)程序,该程序派生一个子进程,并使用exec函数之一在命令行中列出指定为参数的目录的内容。
子进程应首先显示当前工作目录,然后尝试更改为指定目录。然后,它应该(使用
exec
函数之一)执行命令ls
(带有参数--all
,-l
(小写L)和--human-readable
) 。如果无法访问指定的目录(例如,用户没有权限或目录不存在),则应显示适当的响应(请参见下文)。在发生任何错误的情况下,子进程应以返回值1退出。如果目录列表成功,则子进程应以返回值0退出。如果用户未在命令行上指定目录,则应显示适当的用法消息。
一些注意事项:
- 父进程必须正确显示子进程的退出状态
- 子进程必须显示当前工作目录,尝试更改为指定目录,使用指定参数执行
li>ls
,并以exit(0)
或exit(1)
终止。
这是他给我的一个例子(在Linux终端中有输入):
ibrahim@ibrahim-latech:~$ ./prog2 /
Current working directory: /home/ibrahim
Executing ls / --all -l --human-readable
total 132K
drwxr-xr-x 22 root root 4.0K May 25 09:49 .
drwxr-xr-x 22 root root 4.0K May 25 09:49 ..
drwxr-xr-x 2 root root 4.0K Feb 25 2016 bin/
drwxr-xr-x 4 root root 4.0K Feb 25 2016 boot/
...snip...
Exit status: 0
这是目录不存在的示例:
ibrahim@ibrahim-latech:~$ ./prog2 /root
Current working directory: /home/ibrahim
Executing ls /root --all -l --human-readable
Can't chdir to /root
Exit status: 1
我有大部分程序可以工作。我需要做的最后一件事涉及父函数以及如何在最后显示退出状态。
这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
pid_t pid;
pid = fork();
int ret;
char cwd[255];
if(pid == 0){
printf("Current working directory: %s\n",getcwd(cwd, sizeof(cwd)));
printf("Executing ls %s --all -l --human-readable\n",argv[1]);
if(chdir(argv[1])!=0){
printf("this is not a valid directory");
exit(1);
}
else{
execl("/bin/ls","ls","--all","-l","--human-readable", NULL);
exit(0);
}
}
else{
printf("Exit status:");// not sure how to put the 1 or 0 in this
}
}
由于某种原因,它不打印父进程中的内容