C - Execl系统调用

时间:2016-10-05 22:53:01

标签: c system-calls

我正在尝试在子进程上使用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)
$

有人可以帮我这个吗?

1 个答案:

答案 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);