c-execl(参数)的使用

  • 本文关键字:参数 c-execl c execl
  • 更新时间 :
  • 英文 :


C新手。因此,我有一个名为test.c的程序(不需要任何参数即可启动,编译如下(gcc测试。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"代替"pink elephants",这取决于你的口味。建议的三个程序名称选项中只有两个是彻头彻尾的谎言。如果将environ参数替换为(char **)0或等效参数,则调用该程序时不使用环境变量,这通常被视为对正在运行的程序的滥用(就像告诉它它的名称是"pink elephants"而不是"teste"是对它的滥用(。

你也可以使用变量:

const char *progname = "teste";
execle(progname, progname, (char *)0, environ);

最终使用了execlp,只写了execlp("./teste",NULL,NULL);唯一有效的解决方案。

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

  1. 您没有向执行的程序提供其名称,这充其量是不礼貌的,并导致无益的错误报告等
  2. 如果您不打算提供名称,那么第一个NULL就足够了;第二个永远不会被处理
  3. 使用CCD_ 17意味着CCD_ 19的CCD_;您还不如使用CCD_ 20
  4. NULL不可能像execle()那样在变量参数列表中转换为(char *)0。这不是一个很可能的问题,但#define NULL 0是合法的,如果sizeof(int) == 4而不是sizeof(char *) == 8,那么你可能会遇到困难

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

相关内容

  • 没有找到相关文章

最新更新