execv shell_在C中编写自己的Unix shell – PATH和execv的问题

要实现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.

希望这可以帮助.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值