很 难说 您 在 问 什么 。 此 问题 模棱两可 、 含糊 、 不 完整 、 过于 宽泛 或 过于 修辞 , 无法 以 目前 的 形式 合理 地 回答 。 若 要 协助 澄清 此 问题 以便 重新 开启 , 请 visit the help center 。
10 年 前 就 关门 了 。
我 正在 编写 一 个 UNIX shell , 我 必须 使用 execv()
系统 调用 来 创建 一 个 进程 。 execv()
的 参数 之 一 是 可 执行 文件 的 文件 路径 。 因此 , 如果 有人 键入 /bin/ls
, 它 将 运行 ls
可 执行 文件 。 但 我 需要 的 是 一 个 函数 , 当 键入 ls
时 ,它 将 搜索 ls
的 文件 路径 ( 类似 于 which
命令 ) 。 是否 有 允许 我 执行 此 操作 的 函数 ?
不幸 的 是 , 这 是 一 个 学校 项目 , 我 不 被 允许 使用 execvp()
。 我 需要 实现 一些 路径 搜索 函数 , 然后 将 该 文件 路径 添加 到 execv()
参数 中 。
9条答案
按热度按时间20jt8wwn1#
使用
PATH = getenv("PATH")
从环境中获取路径字符串,然后依次调用strtok(PATH,":")
和strtok(NULL,":")
,将PATH
字符串中的路径解析到char**path
数组中,您需要使用malloc()
分配该数组。将path[x]
+'/'
+argv[0]
放入缓冲区中,并使用access(buffer, X_OK)
查看是否可以在该路径位置执行文件,如果可以,则执行execv(buffer,argv)
。nfs0ujit2#
如果你不能使用execvp,你可以从
char**environ
或char* getenv(const char* name)
中获取PATH变量<unistd.h>,<stdlib.h>然后使用int access(const char* filename, int mode)
来查看文件是否存在以及是否可执行。qltillow3#
我认为execvp()可以满足您的需要。
**编辑:**您实际上是在询问如何手动完成此操作?在这种情况下...
1.在envp(main()的第三个参数)中查找PATH
1.将此分割为个别路径
1.使用stat()检查您的程序是否存在
1.执行您发现存在的第一个
或者,如果您想要一个 * 真正 * 可靠的实现,请使用this。不过,它可能会触发Plagarism检测器:)
jdgnovmf4#
您需要execvp(),它将搜索PATH变量中指定的路径,除非文件名包含“/”。
bvjxkvbb5#
使用
execvp
。例如,此示例将执行
/bin/echo
(假定/bin
在您的PATH中)。8gsdolmq6#
有些人建议您在尝试使用
execv()
执行程序之前调用access()
或stat()
。您不需要这样做。如果execv()
无法执行所请求的文件,它将返回一个错误。8ljdwjyq7#
在execvp手册页中:
也许你可以使用execlp()?如果你必须使用execv,你将需要获得PATH环境变量的值,使用strtok()解析它以获得各个路径,将你的文件名附加到每个路径,并尝试使用execv()执行它。
我会提供代码,但我不会帮你做功课。
8wtpewkr8#
学校的作业...
如果你想要一些“像which”的东西,为什么不直接执行“which”本身(在Linux上是/usr/bin/which,而不是bash别名或tcsh内置)来获得你要找的东西的路径...
:—)
u7up0aaq9#
execvp
:-)这里有一个Perl版本,它可以作为问题的伪代码。
split
使用给定的分隔符将一个字符串拆分为一个字符串数组。first
查找第一个匹配某个条件的项;在这里,要查找的目录和名称的连接是可执行的(-x
)。然后它运行。希望能有所帮助!