2016-03-12 5 views
0

Я хочу создать программу, которая выполняет программы из основного аргумента. Предположим, у меня есть программа progr1.c и progr2.c работает. Теперь я скомпилирую программу progr3.c, используя две другие программы в качестве аргументов. Это должно быть результатом:Выполнение программ из главного аргумента

./progr3 progr1 progr2

Результат progr1

Результат progr2

Это то, что я сделал до сих пор:

void main (int args , char **s) { 

int i , x , status; 

if (args >= 2) { 

    x = fork(); 

    for (i = 1 ; i < args ; i++) { 

      if (x == 0) { 
      execv (s[1],s); 
      } 
      else 
     { 
      wait (&status); 
      _exit(i); 
     } 
      x= fork(); 
     } 
    } 
    _exit(0); 
} 

Этот код только выводит первую программу аргументов. Поэтому я думаю, что fork() и execv() работают не так, как я хотел. Как я могу изменить программу, чтобы делать то, что хочу?

+0

[ 'INT основной()'] (http://c-faq.com/ansi/voidmainbooks.html) –

ответ

0

При запуске

 execv (s[1],s); // That should have been s[i] 

prog3 не заменяется prog1. Следовательно, логика prog3 теряется.

Необходимо использовать fork, а затем execv на дочернем процессе, если вы хотите сохранить логику prog3.

Если вы заинтересованы в только выход prog1 и prog2, вы можете использовать system(s[i])

Update

Рабочий пример использования fork.

#include <unistd.h> 

int main() 
{ 
    char* programs[] = {"/usr/bin/ls", "/usr/bin/date"}; 
    char* args[] = {NULL, NULL}; 
    for (int i = 0; i < 2; ++i) 
    { 
     int pid = fork(); 
     if (pid) 
     { 
     // Child 
     args[0] = programs[i]; 
     execv(programs[i], args); 
     } 
    } 
} 
+0

Моя ошибка должна быть 'i' вместо' 1'. Но он все еще выполняет только 1-ю программу. Есть ли еще ошибка в коде @R Sahu? –

+0

@ JoséCunha, вы не понимаете, что делает 'execv'. Как только вы его назовете, образ 'prog3' заменяется изображением' prog1'. Следовательно, 'prog3' больше не работает. Вот почему 'prog2' никогда не запускается. –

+0

О, ладно, я понял. Таким образом, в принципе, используя любую функцию семейства '' exec(), это изменит образ исходной программы. Как я могу использовать этот 'execv' inorder, чтобы избежать изменения реальной программы? Может ли это быть 'fork()' решение избежать такой вещи @R Sahu? –

0

execvзаменяет текущий процесс с указанной командой.

Вместо этого используйте system для создания нового процесса. Нет необходимости разветвление либо:

int system(const char *command) 
+0

О, я не знал об этой функции @dovetalk. Но я использовал его, и он все еще не работает правильно. Как это реализовать? –

Смежные вопросы