【发布时间】:2016-10-05 22:53:00
【问题描述】:
我正在尝试在子进程上使用 execl 执行函数,但它返回错误。 这是我的代码:
pid_t Process = fork();
if(Process == 0){
execl("path/to/executable/executable", "executable", "function", "function_parameter", (const char*)NULL);
}
else if(Process < 0){ //do something
}
else
{
//parent
}
程序从标准输入读取命令(每个命令都是一个函数),“函数名”和“函数参数”是输入。为了 示例:
$ ./executable
Welcome to the program
functionN 2
(function N gets executed with 2 as a parameter)
$
有人可以帮我解决这个问题吗?
【问题讨论】:
-
检查
execl调用是否成功(如果返回则失败)。并且“按照惯例,第一个参数应该指向与正在执行的文件关联的文件名”。 -
@kaylum 它不返回-1,这意味着它成功了对吧?我注意到它在打印“Welcome to the program”时进入了程序,但它没有运行 arg0 和 arg1...
-
嗯,那是一个不同的问题。你说“什么都没发生”!这非常具有误导性,因为您现在说可执行文件实际上已运行。我们看不到被调用程序的代码。但正如我所说,大多数程序都希望 arg0 是程序名称,如果是这种情况,那么你所有的 args 都不合适。
-
请注意,如果您在命令行中运行
executable arg0 arg1,则需要使用execl("path/to/executable", "executable", "arg0", "arg1", (char *)NULL);。如果execl()返回,您还应该做一些理智的事情(意思是“报告错误并以错误状态退出”),如果它无法执行命令,它会这样做。成功时,它不会返回。因此,无需测试来自execl()的返回值。 -
在
execl返回后调用perror以获得更精确的错误描述。
标签: c system-calls