要实现cd命令,您只需要系统调用chdir.
#include
int chdir(
const char *path /* the path name */
);
所以你可以打电话给:
int ret1 = chdir("../foo/bar");
当可以更改到该目录时,chdir的返回值为0;如果发生错误,则返回-1.对于错误,您应该合并手册页.
任何程序都可以检查当前目录,因此如果执行不带任何参数的ls,那么ls会检查它运行的目录并使用此目录作为唯一参数.这是ls的一个特性,而不是execv调用的特性.
第二部分.
#include
int execv(
const char *path, /* programm path*/
char *const argv[]/* argument vector*/
);
execv在给定路径上执行可执行文件,并使用argv中给出的参数.
所以如果你想执行/ bin / ls ../foo / bar,你需要类似的东西
char *cmd_str = "/bin/ls";
char *argv[] = {cmd_str, "../foo", "/bar", NULL };
if (execv(cmd_str, argv) == -1 ){
/* an error occurred */
}
execv返回的错误是-1.如果你想知道它为什么没有执行命令,请查看手册页.
char * argv []中的NULL = {cmd_str,“../ foo”,“/ bar”,NULL};是否表示NULL后没有其他参数.
第三部分.
基于Unix的系统通常将带有/的命令视为可以直接执行的命令.这意味着您首先检查给定命令字符串中是否存在斜杠.
int ret_value;
if (strchr(cmd_str, '/')
if (execv(cmd_str, argv) == -1 ){
/* an error occurred */
}
如果没有斜杠,则需要遍历PATH中的所有目录并检查是否可以执行该命令.所以给定的命令是ls ../foo / bar,并假设PATH的值是“.:/ sbin:/ bin:/usr/bin”.
然后我们会尝试首先执行./ls ../foo / bar然后/usr/bin/ls ../foo / bar以及最后/ bin / ls ../foo / bar.
希望这可以帮助.