2013-02-10 84 views
1

我遇到了此execve命令的问题。我可以用它在我的程序中运行大多数其他命令,但是如果我尝试像man ls或其他东西那样得到此错误。execve error当调用execve(man,args,env)

man: can't execute pager: No such file or directory 
man: command exited with status 255: LESS=-ix8RmPm Manual page ls(1) ?ltline  %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$PM Manual page ls(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for help or q to quit)$ MAN_PN=ls(1) pager -s 

这里是我怎样,我称之为:

execve(cmdPath, args, env); 

其中cmdPath是路径(在这种情况下/usr/bin/manargschar*其中args[0] = manargs[1] = ls env是我env*[]从传递主要。

任何帮助将不胜感激。我在这里死去。

+0

可以运行'男人ls'正确地从您用来启动程序相同的壳呢? – us2012 2013-02-10 05:23:52

+0

耶只好。 – 2013-02-10 05:24:53

+1

你可以用'args [0] = ls' – Ganesh 2013-02-10 05:46:18

回答

3

Null终止您传递给execve的参数。像

char *args[3]; 
// other args.. 
args[2] = (char*) 0; 

这是未定义的行为,否则这可能是为什么它有时在过去有效,这次你不走运。

这工作:

int main(int argc, char *argv[], char *env[]) 
{ 
    char *args[3]; 

    args[0] = "man"; 
    args[1] = "ls"; 
    args[2] = (char*) 0; 

    execve("/usr/bin/man", args, env); 
} 
+0

以及只有当我设置我的env [0] = NULL时,它才有效。 - 即使如此,在我看到手册页之前,它给了我一个警告,说明终端没有正确行事。但是我注意到,我的env []和我在提示符中键入env不一样所以如果我查看我的PATH变量,通常我有8个不同的路径。但在我的c程序中,如果我打印env变量,则只有一个PATH。 – 2013-02-10 13:07:22

+0

哦,男孩。我发现了错误。我刚刚进入并硬编码的env [15]是字符串“PATH =/usr/bin:........”getenv(“PATH”)给我的所有东西,并且一切都完美无缺。但是为什么我的env [15]与我的getenv(“PATH”)有所不同?我感到很困惑。 – 2013-02-10 13:22:51