Unix路径搜索C函数[已关闭]

hfyxw5xn  于 2022-11-04  发布在  Unix
关注(0)|答案(9)|浏览(193)

很 难说 您 在 问 什么 。 此 问题 模棱两可 、 含糊 、 不 完整 、 过于 宽泛 或 过于 修辞 , 无法 以 目前 的 形式 合理 地 回答 。 若 要 协助 澄清 此 问题 以便 重新 开启 , 请 visit the help center
10 年 前 就 关门 了 。
我 正在 编写 一 个 UNIX shell , 我 必须 使用 execv() 系统 调用 来 创建 一 个 进程 。 execv() 的 参数 之 一 是 可 执行 文件 的 文件 路径 。 因此 , 如果 有人 键入 /bin/ls , 它 将 运行 ls 可 执行 文件 。 但 我 需要 的 是 一 个 函数 , 当 键入 ls 时 ,它 将 搜索 ls 的 文件 路径 ( 类似 于 which 命令 ) 。 是否 有 允许 我 执行 此 操作 的 函数 ?
不幸 的 是 , 这 是 一 个 学校 项目 , 我 不 被 允许 使用 execvp() 。 我 需要 实现 一些 路径 搜索 函数 , 然后 将 该 文件 路径 添加 到 execv() 参数 中 。

20jt8wwn

20jt8wwn1#

使用PATH = getenv("PATH")从环境中获取路径字符串,然后依次调用strtok(PATH,":")strtok(NULL,":"),将PATH字符串中的路径解析到char**path数组中,您需要使用malloc()分配该数组。将path[x] + '/' + argv[0]放入缓冲区中,并使用access(buffer, X_OK)查看是否可以在该路径位置执行文件,如果可以,则执行execv(buffer,argv)

nfs0ujit

nfs0ujit2#

如果你不能使用execvp,你可以从char**environchar* getenv(const char* name)中获取PATH变量<unistd.h>,<stdlib.h>然后使用int access(const char* filename, int mode)来查看文件是否存在以及是否可执行。

qltillow

qltillow3#

我认为execvp()可以满足您的需要。

**编辑:**您实际上是在询问如何手动完成此操作?在这种情况下...

1.在envp(main()的第三个参数)中查找PATH
1.将此分割为个别路径
1.使用stat()检查您的程序是否存在
1.执行您发现存在的第一个
或者,如果您想要一个 * 真正 * 可靠的实现,请使用this。不过,它可能会触发Plagarism检测器:)

jdgnovmf

jdgnovmf4#

您需要execvp(),它将搜索PATH变量中指定的路径,除非文件名包含“/”。

bvjxkvbb

bvjxkvbb5#

使用execvp

char *args[] = {"ls", (char *) NULL};
execvp("ls", args);

例如,此示例将执行/bin/echo(假定/bin在您的PATH中)。


# include <unistd.h>

int main()
{
    char *args[] = {"echo", "hello world", (char *) NULL};
    execvp("echo", args);
    return 0;
}
8gsdolmq

8gsdolmq6#

有些人建议您在尝试使用execv()执行程序之前调用access()stat()。您不需要这样做。如果execv()无法执行所请求的文件,它将返回一个错误。

8ljdwjyq

8ljdwjyq7#

在execvp手册页中:

The  functions  execlp() and execvp() will duplicate the actions of the
   shell in searching for an executable file  if  the  specified  filename
   does  not  contain  a slash (/) character.  The search path is the path
   specified in the environment by the PATH variable.   If  this  variable
   isn’t specified, the default path ‘‘:/bin:/usr/bin’’ is used.  In addi-
   tion, certain errors are treated specially.

也许你可以使用execlp()?如果你必须使用execv,你将需要获得PATH环境变量的值,使用strtok()解析它以获得各个路径,将你的文件名附加到每个路径,并尝试使用execv()执行它。
我会提供代码,但我不会帮你做功课。

8wtpewkr

8wtpewkr8#

学校的作业...
如果你想要一些“像which”的东西,为什么不直接执行“which”本身(在Linux上是/usr/bin/which,而不是bash别名或tcsh内置)来获得你要找的东西的路径...
:—)

u7up0aaq

u7up0aaq9#

execvp:-)
这里有一个Perl版本,它可以作为问题的伪代码。

use List::Util qw(first);

my @path = split /:/, $ENV{PATH};
my $dir = first {$_ ||= '.'; -x "$_/$name"} @path
    or die "Can't find program $name\n";
exec "$dir/$name", @args;

split使用给定的分隔符将一个字符串拆分为一个字符串数组。first查找第一个匹配某个条件的项;在这里,要查找的目录和名称的连接是可执行的(-x)。然后它运行。
希望能有所帮助!

相关问题