Как вы пишете программу C для выполнения другой программы?
В linux я хотел бы написать программу на C, которая запускает другую программу. Когда программа запускается, оболочка будет ждать ввода команды, определенной в вашей программе. Эта команда запустит вторую программу.
Например, предположим, что существует простая программа C, называемая "привет" в том же каталоге, что и вызывающая программа. Программа "привет" выводит результат "привет, мир". Первая программа будет запущена, и пользователь будет вводить команду "привет". Программа "привет" будет выполнена и "привет, мир". будет выводиться в оболочку.
Я сделал поиск, и люди предложили функции "fork()" и "exec()". Другие сказали использовать "system()". Я не знаю об этих функциях. Как я могу назвать эти функции? Они подходят для использования?
Пример кода с пояснениями будет наиболее полезен. Другие ответы также приветствуются. Ваша помощь с благодарностью.
Ответы
Ответ 1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */
int main()
{
/*Spawn a child to run the program.*/
pid_t pid=fork();
if (pid==0) { /* child process */
static char *argv[]={"echo","Foo is my name.",NULL};
execv("/bin/echo",argv);
exit(127); /* only if execv fails */
}
else { /* pid!=0; parent process */
waitpid(pid,0,0); /* wait for child to exit */
}
return 0;
}
Ответ 2
Если вы новичок в fork, вам может быть полезно графическое представление о fork и exec.
Изображение fork()
+-------------+
|main program |
+-------------+ (fork())
|___________________________
+-------------+ |
|main program | +-------------+
+-------------+ |main program |
| +-------------+
+-------------+ | (exec())
|main program | +-------------+
+-------------+ |hello program|
+-------------+
Как вы уже могли прочитать в учебнике, после вызова fork()
создается дублируемая копия существующей программы, а exec()
после этого заменяет эту копию новой программой, которую вы передаете ей как аргументы, Два исполнительных блока для двух программ будут запущены после fork()
.
Ответ 3
Вам не хватит system()
?
/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */
Ответ 4
Для самого простого случая вам нужно скомпилировать программы в одном каталоге:
> ls
.
hello
second
Во второй программе вам просто нужно позвонить system("hello");
Ответ 5
Я сделал поиск, и люди предложили функции fork()
и exec()
. Другие сказали использовать system()
. Я не знаю об этих функциях. Как я могу назвать эти функции? Они подходят для использования?
Да. Сначала прочитайте документацию (страница man
), например. fork (2), exec (3), система (3). Вероятно, у вас есть эта документация локально на вашем компьютере, используя man (1). Обратите внимание, что system
использует sh
(через bash (1) или тире (1)), потому что это fork
-ing, execve (2) -ing и waitpid (2) -в /bin/sh
Оболочка POSIX.
Я думаю, что fork
трудно понять, потому что при успехе он возвращает "дважды". Я не буду пытаться объяснить это здесь (для этого мне понадобится много страниц). Я рекомендую сначала прочитать fork (системный вызов) wikipage. Затем прочитайте хорошую книгу программирования Linux, например Advanced Linux Programming (свободно загружаемый).
Читайте также о виртуальном адресном пространстве и proc (5 ).
Вы также можете прочитать Операционные системы: три простых Pieces для более общего вида.