如何知道给execlp()的命令是否存在?

时间:2012-04-15 21:44:47

标签: c unix exec fork parent-child

我搜索了很多,但我仍然没有答案。我有一个程序,通过询问用户所需的命令来创建其他进程,然后我使用execlp打开这个新进程。我想知道父进程是否有一种简单的方法可以找出命令是否已执行,或者接收到的命令是否存在。

我有以下代码:

if (executarComando(comando) != OK)
   fprintf(stderr,"Nao foi possivel executar esse comando. ");

其中executarComando是:

int executarComando(char* cmd) {
if ( execlp("xterm", "xterm", "-hold", "-e", cmd, NULL) == ERROR) // error
    return ERROR;
return OK;
}

2 个答案:

答案 0 :(得分:1)

没有琐碎的方式;经常使用的约定是fork() ed孩子将在exit(-1)失败的特定情况下报告错误和exit(255)(或exec()),并且大多数命令都避免使用对于他们自己的失败模式。

答案 1 :(得分:1)

你的问题是你的execlp总能成功;它正在运行xterm,而不是您传递给shell xterm的命令。您需要在程序和此shell之间添加某种通信通道,以便您可以回复成功或失败。我会做一些事情,比如用

替换命令
( command ) 99>&- ; echo $? >&99

然后,在分叉前调用execlp打开管道,在子代中,使用dup2创建对应于管道写入端的文件描述符编号99。现在,您可以通过管道读回命令的退出状态。

希望xterm不会关闭你的所有文件描述符;否则你运气不好而且你必须在文件系统的某个地方制作一个临时的fifo(通过mkfifo)以获得相同的结果。

请注意,数字99是任意的;除0,1或2以外的任何东西都应该有效。