Как вы пишете программу 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 для более общего вида.