gpt4 book ai didi

c - execl 的使用(参数)

转载 作者:行者123 更新时间:2023-11-30 20:18:42 25 4
gpt4 key购买 nike

C语言新手。所以我有一个名为 test.c 的程序(不需要任何参数来启动,像这样编译“ gcc test.c -o 测试”)我想让我的其他程序执行测试我知道我必须使用 execl,但我只是无法理解 execl 函数中的参数

execl(代码在这里)

最佳答案

execle() 的所有参数除了最后两个是字符串 - 倒数第二个是空 char * 标记命令行参数的结尾,最后一个是 char ** 指定环境。第一个是可执行文件的路径名,如果名称不以 / 斜杠开头,则相对于当前目录。第二个参数是程序的名称。后续参数是程序的额外参数(列表以 (char *)0 参数终止),最后一个参数是程序的环境(尾随的 e 表示环境通过)。因此,例如:

extern char **environ;    // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);

您可以根据您的喜好使用“teste”“/bin/bash”来代替“粉红大象”。建议的三个程序名称选项中只有两个是彻头彻尾的谎言。如果将 environ 参数替换为 (char **)0 或等效参数,则在没有环境变量的情况下调用程序,这通常被视为滥用程序运行(而不是告诉它它的名字是“pink大象”而不是“teste”是对它的滥用)。

您也可以使用变量:

const char *progname = "teste";

execle(progname, progname, (char *)0, environ);
<小时/>

Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.

令人印象深刻的是,一行简单的代码中可能存在如此多的(小)问题。使用 execlp("./teste", NULL, NULL); 至少在这些方面是可疑的:

  1. 您没有向执行的程序提供名称,这充其量是无礼的行为,并且会导致无用的错误报告等。
  2. 如果您不打算提供名称,第一个 NULL 就足够了;第二个从未被处理。
  3. 使用"./teste"意味着execlp()p(路径搜索)部分永远不会被执行;您不妨使用 execle("./teste", (char *)NULL, environ);
  4. NULL 并非不可能在变量参数列表中转换为 (char *)0,就像 execle() 一样。这不是一个很可能出现的问题,但是 #define NULL 0 是合法的,并且如果 sizeof(int) == 4sizeof(char *) == 8 ,那么你可能会遇到困难。

旁白:您可能会发现 execv*() 函数通常比 execl*() 函数更有用。至少,我的经验是,我运行的程序比固定长度列表更经常需要可变长度参数列表。

关于c - execl 的使用(参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53245178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com