Вы должны написать вход в стандартный ввод исполняемого файла, так что вы, вероятно, следует использовать трубу:
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);
Проверить удался ли 'execl' вызов или нет (если она возвращает то не удалось). И «Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом». – kaylum
@kaylum Он не возвращает -1, это означает, что он сработал правильно? Я заметил, что он входит в программу, когда он печатает «Добро пожаловать в программу», но он не запускает arg0 и arg1 ... – VCanas
Ну, это другая проблема. Вы сказали: «ничего не происходит»! Это очень вводит в заблуждение, поскольку вы сейчас говорите, что исполняемый файл был запущен. Мы не можем видеть код для вызываемой программы. Но, как я уже сказал, большинство программ ожидают, что arg0 будет именем программы, и если это так, то все ваши аргументы неуместны. – kaylum