2016-10-05 2 views
-1

Я пытаюсь выполнить функцию с помощью execl для дочернего процесса и возвращает ошибку. Вот мой код для этого:C - Системный вызов 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) 
$ 

Может кто-то помочь мне с этим, пожалуйста?

+2

Проверить удался ли 'execl' вызов или нет (если она возвращает то не удалось). И «Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом». – kaylum

+0

@kaylum Он не возвращает -1, это означает, что он сработал правильно? Я заметил, что он входит в программу, когда он печатает «Добро пожаловать в программу», но он не запускает arg0 и arg1 ... – VCanas

+1

Ну, это другая проблема. Вы сказали: «ничего не происходит»! Это очень вводит в заблуждение, поскольку вы сейчас говорите, что исполняемый файл был запущен. Мы не можем видеть код для вызываемой программы. Но, как я уже сказал, большинство программ ожидают, что arg0 будет именем программы, и если это так, то все ваши аргументы неуместны. – kaylum

ответ

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; было бы более ортодоксальный, возможно, использовать: (. Помните, что sizeof() включает в себя терминальный нуль в строковый литерал, или при определении размера массив строк как line, которые не должны быть записаны на ребенка)

char line[] = "functionN 2\n"; 
… 
write(p[1], line, sizeof(line) - 1); 

Вы должны, возможно, убедиться, что значение 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); 
Смежные вопросы