我正在尝试在子进程上使用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
}
程序从stdin中读取命令(每个命令都是一个函数),“函数名”和“函数参数”是输入。对于 例如:
$ ./executable
Welcome to the program
functionN 2
(function N gets executed with 2 as a parameter)
$
有人可以帮我这个吗?
答案 0 :(得分:0)
您需要将输入写入可执行文件的标准输入,因此您应该使用管道:
int p[2];
pipe(p); // Error check?
pid_t Process = fork();
if (Process < 0)
{
perror("fork()");
close(p[0]);
close(p[1]);
}
else if (Process == 0)
{
dup2(p[0], 0);
close(p[0]);
close(p[1]);
execl("path/to/executable/executable", "executable", (char *)NULL);
perror("executable");
exit(1);
}
else
{
close(p[0]);
write(p[1], "functionN 2\n", sizeof("functionN 2\n")-1);
close(p[1]);
int status;
pid_t corpse = wait(&status);
}
对于显示的代码,您需要标题<unistd.h>
和<sys/wait.h>
(除<stdio.h>
和<stdlib.h>
之外)。有许多其他方法可以指定行functionN 2
;或许,使用它会更正统:
char line[] = "functionN 2\n";
…
write(p[1], line, sizeof(line) - 1);
(请记住,sizeof()
在字符串文字中包含终止null,或者在调整像line
这样的字符串数组时;不应该将其写入子项。)
您应该可以检查corpse
值是否与Process
值匹配。你会循环,直到你得到正确的尸体,或者你得到一个错误,表明没有更多的孩子。如果您还有尚未等待的父级启动的其他进程,则可以保护您。您还应该考虑报告尸体及其退出状态,至少是出于调试目的:
int status = 0;
pid_t corpse;
while ((corpse = wait(&status)) != Process && corpse != -1)
printf("Other child %d exited with status 0x%.4X\n", (int)corpse, status);
if (corpse == -1)
printf("Oops! Executable died and we did not get told!\n");
else
printf("Executable %d exited with status 0x%.4X\n", (int)corpse, status);