2014-01-30 5 views
0

Мое назначение - написать простую оболочку linux. Я нахожусь на внешних командах. Нам нужно использовать execv.Как я могу заставить execv убить мою программу?

for (int i = 0; i < count; i++){ 
    char path[1024]; 
    strcpy(path, PATHS[i]);   // PATHS is an array of cstrings, the paths in $PATH 
    strcat(path, "/"); 
    strcat(path, command[0]);  // command and commands are essentially the same 
    printf("%d %s",i,path);   // they are essentially argv[] 
    if (!execv(path, commands))  // for ls -l $HOME 
    break;      // commands[0] = ls [1] = -l [2] = my home dir 

сейчас я тестирую его только с помощью ls. ls работает точно так, как должно, но программа закрывается сразу же после успешного выполнения execv. Есть ли способ для меня использовать execv для проверки правильного пути и для продолжения работы программы после успешного выполнения execv?

+0

http://stackoverflow.com/questions/1653340/exec-and-fork/1653415#1653415 –

ответ

3

Функции exec family не убивают ваш процесс. Они заменяют существующий процесс image с тем, который вы выполняете.

В принципе, он работает так, как будто этот процесс (с его PID и связанными ресурсами ядра) остается неизменным, за исключением того, что весь код из старого изображения удаляется и заменяется кодом из программы, которая затем загружается в память и инициализировали, как если бы это был новый процесс. PID не изменяется, поэтому, если вы хотите создать дочерний процесс со своим собственным PID, вам нужно использовать другую функцию.

Правильный способ продолжения: fork и использовать exec * из дочернего процесса. Таким образом, вы можете использовать функцию wait в родительском экземпляре, чтобы дождаться завершения работы дочернего элемента и вернуть его обратно.

+--------------+    +--------------+        +----------------------+ 
|Parent process|+---fork()-->|Parent process|+---------wait()------------>|Parent process resumes| 
+--------------+  +  +--------------+        +----------------------+ 
         |                + 
         |                | 
         |                | 
         |  +-------------+    +-----------------+   | 
         +----->|Child process|+--execv()--->|New process image|+--exit--+ 
          +-------------+    +-----------------+ 
+0

Когда 'execv' заменяет существующий процесс, что произойдет со старым процессом? – sujin

+0

выполненный ** изображение ** меняется. Процесс все еще существует, и ПИД-код остается прежним. Редактирование моего сообщения, чтобы сделать это яснее. – SirDarius

+0

Спасибо, теперь понятно. если вы можете объяснить больше об этой строке ', если вы хотите создать дочерний процесс со своим собственным PID, вам нужно использовать другую функцию.' – sujin

1

Различные формы Exec() на самом деле заменить текущий образ процесса с запрашиваемым один. Они не порождают новый процесс. Поэтому вам нужно сделать это самостоятельно, используя fork().

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