2016-11-22 2 views
0

Я пытаюсь создать программу, которая создает до 4 дочерних процессов. Каждый ребенок будет использовать функцию поиска, чтобы найти определенное слово в нужном файле:Как отправить сигнал kill нескольким дочерним процессам в случае сбоя выполнения задачи?

поиска BOOL (полукокса * файл, символ * слова, внутр раздел)

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

Каждый дочерний процесс будет искать в определенном разделе файла. то есть файл с именем "Foo", что containts:

автомобиля

бар

дегтя

далеко

ребенок процессы ищет строку "бар".

Если дочерний процесс удается найти строку, она будет выходить со значением 0 (выхода (0)), в противном случае, если он закончил весь свой участок, не Sucess найти строку будет выйти со значением 1 (выход (1)).

Как только ребенок существует со значением 0 (преследуется при поиске строки). Родитель отправит сигнал уничтожения другим дочерним процессам.

Рассмотрим следующий код:

#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 


int main() 
{ 
    pid_t p; 
    p=fork(); 
    int i; 
    int storage[4]; 
    for(i=0;i<4;i++) 
    { 
     p=fork(); 
     if(p==0) 
     { 
      storage[i]=getpid(); 
      open("testfile.txt",O_WRONLY); 
      if(search("testfile.txt","bar",i)) 
      { 
       storage[i]=1; 
       //exit(0); 
      } 
      else 
       //exit(1); 
     } 
    } 

    for(i=0;i<4;i++) 
    { 
     if(storage[i]!=1) 
      kill(stroage[i],SIGTERM); 
    } 
} 

То, что я сделал в этом коде используется массив из 4 чисел, он содержит идентификаторы дочерних процессов. Случай дочернего файла, который был успешно заменен, изменился на 1. Затем я отправил сигнал уничтожения другим процессам, кроме этого конкретного процесса.

Является ли код, который я написал правильно? Если да, то как использовать значения выхода для отправки сигнала без использования массива?

+0

'storage' - объект с автоматическим хранением. Это, конечно, не разделяется между процессами, поэтому ваш подход абсолютно не работает. – EOF

+0

@EOF Я думаю, что получаю это, у 4 дочерних процессов будет собственное поле памяти хранилища переменных, верно? Вот почему он не будет работать, поскольку родитель не будет иметь значений в переменной? Что делать, если я использую его как указатель? Это решит? – Amine

+0

Указатель только разрешил бы это, если бы указал на память, которая разделена между процессами. В этом случае вам также необходимо обеспечить атомарность и порядок доступа к общей памяти. – EOF

ответ

0

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

Также fork() возвращает дочерний идентификатор процесса родительскому объекту. Родитель может хранить его в массиве.

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

  • Нет связанных вопросов^_^