2016-01-29 5 views
-1

Я работаю над своим школьным проектом, и я уже несколько дней задерживаюсь на этом этапе. Любая помощь будет высоко оценена!  Перезагрузите программу C с терминала Bash

То, что я пытался до сих пор:  

  • Составление сценария. Он правильно компилируется, и я могу запустить его, набрав ./process.o, но я не могу этого сделать, когда я его убью, он перезапускается. Я занимался поиском и поиском различных вещей, но ничего не работает, он всегда убивает процесс, но не перезапускает его.
  • убийство -SIGKILL (ПИД)
  • убить 2 (ПИД)
  • убить 1 (ПИД)
  • убийство -HUP 3155
  • Различные другие команды, которые только убивали его, ничто не похоже на работу. Нужно ли мне модифицировать код или что-то еще? Я глубоко смущен.  

Вот что я должен сделать:

Создайте новый файл с C. Сохраните его с именем process.c (ли это)

#include <stdio.h> 
#include <unistd.h> 

int main() { 
    printf("Creating a background process..\n"); 
    pid_t pid = fork(); 

    if (pid > 0) return 0; /* Host process ends */ 
    if (pid < 0) return -1; /* Forking didn't work */ 

    while(1) { } /* While loop */ 
    return 0; 
} 

Скомпилировать следующий код рабочей программы process.o и начать процесс. (Ли это, работает в данный момент)

Используйте kill команду, которая перезапускает process.o (Killing процесс работает, но не перезапустить его)

+1

Вы уверены, что это именно то, что вам нужно сделать? Потому что это не имеет большого смысла для меня. Команда 'kill' ничего не перезапустит. – kirelagin

+1

Также использование расширений '.o' для результирующего _linked binary_ является довольно странным. – kirelagin

+0

Да, я тоже смущен. Я знаю основы Linux и C/C# и Java, но это не имеет для меня никакого смысла. Я не знаю, должен ли я каким-то образом изменить код, но задача заключается в следующем: используйте команду kill, чтобы снова запустить process.o. – Jones

ответ

5

Вы должны держать родительский процесс работает в контролировать детский процесс. Если родитель обнаруживает, что ребенок больше не работает, он может перезапустить его.

Родитель может использовать системный вызов wait для обнаружения, когда ребенок завершает работу.

while (1) { 
    pid_t pid = fork(); 
    if (pid < 0) { 
     return -1; 
    } else if (pid > 0) { 
     // parent waits for child to finish 
     // when it does, it goes back to the top of the loop and forks again 
     wait(NULL); 
    } else { 
     // child process 
     while (1); 
    } 
} 
+0

Я не могу вас поблагодарить, это решило мою проблему. Спасибо! :) – Jones

+0

@ Jones Glad Я мог бы помочь. Не стесняйтесь [принять этот ответ] (http://stackoverflow.com/help/accepted-answer), если вы сочтете это полезным. – dbush