2014-10-11 2 views
-1

У меня возникают проблемы, мне нужно создать программу, которая выполняет 9 дочерних процессов, после чего я должен поставить отсчет 3 секунды и заставить эти 9 процессов ждать сигнала от отца, после того, как они получают этот сигнал, каждый ребенок должен сказать, какими детьми он является (если он является детьми № 1, № 2, № 3 и т. д.), чтобы они были сделаны).Ребенок и родительский процесс с fork()

Что я делаю здесь, все в порядке, я думаю, до той части, где я должен говорить как дети, каково мое число, я не знаю, как это сделать, потому что каждый дети - это другой процесс, они не обмениваются памятью, и сигнал не может использовать аргументы для этого, теперь я печатаю PID для функции, называемой «обработчик», но как я могу напечатать свой номер в качестве «Дети» ?.

#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <sys/types.h> 

void handler(int x); 

int main() {  
    pid_t child[9]; 
    pid_t child_pid; 

    for (int i = 0; i < 9; ++i) { 
     child_pid = fork(); 
     child[i] = child_pid; 

     if (child_pid == 0) 
      break; 

     if (child_pid < 0) { 
      perror("fork()"); 
      exit(EXIT_FAILURE); 
     } 
    } 

    if (child_pid == 0) { 
     signal(SIGUSR1, handler); 
     pause(); 
    } else { 
     printf("Countdown:\n"); 
     sleep(1); 
     printf("3\n"); 
     sleep(1); 
     printf("2\n"); 
     sleep(1); 
     printf("1\n"); 
     sleep(1); 

     for (int i = 0; i < 9; i++) 
      kill(child[i], SIGUSR1); 

     waitpid(-1, NULL, 0); 
    } 

    return 0; 
} 

void handler(int sig) { 
    printf("This is Child #%d\n", getpid()); 

    exit(0); 
} 
+0

У ребенка есть копия родительской памяти. Поэтому он может получить доступ к переменной цикла 'i', чтобы получить ее номер. – Barmar

+0

Возможный дубликат [Child and Parent pid with fork();] (http://stackoverflow.com/questions/26310824/child-and-parent-pid-with-fork) –

+0

@MikeW Это похоже на дубликат этого вопроса, но ответ там никогда не показывает, как решить проблему. – Barmar

ответ

1

Создать глобальную переменную:

int my_number; 

Затем в цикле, который создает детей, сделайте следующее:

if (child_pid == 0) { 
     my_number = i; 
     break; 
    } 

Затем вы можете использовать переменную в обработчике:

void handler(int sig) { 
    printf("This is Child #%d\n", my_number); 

    exit(0); 
} 
Смежные вопросы