Как вы пишете программу на C для выполнения другой программы? - PullRequest
22 голосов
/ 28 марта 2011

В Linux я хотел бы написать программу на C, которая запускает другую программу.Когда программа запустится, оболочка будет ждать, пока вы введете команду, определенную в вашей программе.Эта команда запустит вторую программу.

Например, предположим, что в том же каталоге, что и вызывающая программа, есть простая программа на языке C под названием "hello".Программа "hello" печатает вывод "hello, world".Первая программа будет запущена, и пользователь введет команду «привет».Программа «Привет» будет выполнена и «Привет, мир».будет выведен в оболочку.

Я провел некоторый поиск, и люди предложили функции "fork ()" и "exec ()".Другие говорили, что используют "system ()".Я не знаю об этих функциях.Как я называю эти функции?Они подходят для использования?

Пример кода с пояснениями будет наиболее полезным.Другие ответы также приветствуются.Ваша помощь очень ценится.

Ответы [ 5 ]

31 голосов
/ 28 марта 2011
#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;
}
8 голосов
/ 28 марта 2011

Если вы новичок в fork, вам может помочь графическое представление о fork и exec.

Изображение fork()

  +-------------+  
  |main program |  
  +-------------+    (fork())
        |___________________________  
  +-------------+                   |
  |main program |           +-------------+ 
  +-------------+           |main program |
        |                   +-------------+  
  +-------------+                   |        (exec())
  |main program |           +-------------+
  +-------------+           |hello program|
                            +-------------+  

Как вы, возможно, уже читали в учебнике, после вызова fork() создается дублирующая копия существующей программы, а exec() после этого заменяет эту копию новой программой, которую вы передаете ей в качестве аргументов. , Два исполнительных блока для двух программ будут запущены после fork().

5 голосов
/ 28 марта 2011

Вам не будет system() достаточно?

/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */
1 голос
/ 28 марта 2011

В самом простом случае вам нужно две скомпилированные программы в одном каталоге:

> ls
.
hello
second

Во второй программе вам просто нужно вызвать system("hello");

0 голосов
/ 13 октября 2017

Я провел некоторый поиск, и люди предложили функции fork() и exec(). Другие говорили, что используют system(). Я не знаю об этих функциях. Как я называю эти функции? Они подходят для использования?

Да. Сначала прочитайте документацию (man страница), например, вилка (2) , exec (3) , system (3) . Вполне вероятно, что у вас есть эта документация локально на вашем компьютере, используя man (1) . Обратите внимание, что system использует sh (через bash (1) или dash (1) ), потому что это fork -ing, execve (2) -ing и waitpid (2) -ing /bin/sh POSIX.

Я думаю, что fork трудно понять , потому что в случае успеха он возвращает "дважды". Я не буду пытаться объяснить это здесь (мне понадобится много страниц для этого). Я рекомендую сначала прочитать fork (системный вызов) wikipage. Затем прочитайте хорошую книгу по программированию для Linux, например, Расширенное программирование для Linux (свободно загружаемое).

Читайте также о Виртуальном адресном пространстве и proc (5) .

Вы также можете прочитать Операционные системы: три простых части для более общего вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...