execl(参数)的使用

问题描述 投票:0回答:1

我有一个名为

test.c
的程序(不需要任何参数来启动,编译如下:

gcc test.c -o test

我想让我的其他程序执行

test

我知道我必须使用

execl()
但我就是无法理解
execl
函数中的参数。

execl( code here )
c execl
1个回答
0
投票

除了最后两个之外,

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. 使用
    "./teste"
    意味着
    p
    execlp()
    (路径搜索)部分永远不会被执行;你可能还用过
    execle("./teste", (char *)NULL, environ);
  4. 在变量参数列表中,
    NULL
    不翻译为
    (char *)0
    也不是不可能,就像
    execle()
    一样。 这不是一个很可能的问题,但
    #define NULL 0
    是合法的,如果
    sizeof(int) == 4
    sizeof(char *) == 8
    ,那么你可能会遇到困难。

旁白:您可能会发现

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

© www.soinside.com 2019 - 2024. All rights reserved.