【问题标题】:A more efficient way than: execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL);比: execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL);
【发布时间】:2017-08-15 19:10:04
【问题描述】:

我正在尝试制作一个命令行接口程序,该程序可以从用户输入中获取代码行并使用 execlp 执行它们。

我想知道是否有更好的方法来编写我的代码。

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL);
perror("Execlp");

例如用户输入 4 个单词,每个单词将存储在:

cmd[0] cmd[1] cmd[2] cmd[3]

如果我们使用编译函数cc helloworld.c -o helloworld 这将需要数组 cmd[] 内的 4 个空间@

或者我们使用./helloworld

它将存储在cmd[0] 并运行它,这很好用

但我假设如果有一个需要超过 4 个字的函数,我的程序能够执行它们吗?答案可能是否定的,例如:如果有 5 个或更多单词,我认为我的程序将无法运行它,除非在我的函数中它将有 5 个元素可以工作

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3]. cmd[4], NULL);

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], NULL);
perror("Execlp");

有没有更有效的方法来做到这一点?通过使用exec() family 中的其他功能。

谢谢:)

【问题讨论】:

  • 为什么不使用int execvp(const char *file, char *const argv[])
  • 嗯我以前用过这个,但我不认为我真的理解它们,我很快就会发布一个代码,我尝试使用它们,当我使用它时它只能接受一些值 i有在 argv ...
  • ( (char *args[] = {cmd[0], cmd[1], NULL}; execvp(cmd[0], args); perror("Execp"); ) 此代码仅适用于需要两个单词的函数,例如cc hw.c; rm hw.c;如果我尝试cc hw.c -o hw,这是 4 个字,它将无法正常工作

标签: c linux unix exec


【解决方案1】:

使用execvp() 怎么样?例如:

[STEP 110] # cat execvp.c
#include <unistd.h>

int
main(int argc, char *argv[])
{
    /* argv[argc] is always NULL */
    execvp(argv[1], &argv[1]);
    return 0;
}
[STEP 111] # gcc -Wall execvp.c
[STEP 112] # ./a.out echo 1
1
[STEP 113] # ./a.out echo 1 2
1 2
[STEP 114] # ./a.out echo 1 2 3
1 2 3
[STEP 115] #

【讨论】:

  • 我知道有比我的更好的方法,谢谢!解决我的好奇心!你能解释一下这是如何工作的吗,我已经测试了函数内部是否没有 int argc(int argc, char*cmd[]) 它仍然会正常运行..
  • 详情请参考 execvp 的手册页,我的英文不太好。对于“int argc”,不使用函数的arg不是错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多