присваивать дочерним pid, созданным в цикле, массив - PullRequest
2 голосов
/ 25 марта 2019

(Отредактировано: исправлены некоторые вещи, основанные на ваших комментариях, но все еще не нужные мне результаты - некоторые процессы становятся осиротевшими и получают родительский init (pid 1), это потому, что цикл завершения находится внутри другого цикла? Как еще я могу активировать и завершить на той же петле, что я раздвоил?)

В следующем коде мне нужно напечатать pid, созданный с помощью fork() в цикле в сообщении, когда сигнал отправляется процессу, но я получаю значение по умолчанию для всех pid (0). Домашнее задание включало отправку сигналов дочерним процессам в соответствии с рядом аргументов, т.е. ./a.out 1 3 5 4 2 должен будет отправлять сигналы дочерним процессам 1 3 5 4 2 в этом порядке и печатать их pid также в этом порядке.

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

/*SIGCHLD, SIGCONT*/
int status;
static int alarmOn = 0;
int main(int argc, char **argv)
{    

 pid_t pid[5], f;
     void activateChild(int signal)
        {
             alarmOn = 1;
        }
     (void) signal(SIGCONT,activateChild);


     for(int i = 0; i < 5; i++)         
 { 
   f = fork();
       if (f < 0 )
            {   

        printf("\nfork failed\n");

    }
   if (f == 0)
    {   

        printf("\nprocess %d, %d is paused\n",i,getpid());
                pause();    
    }

    if (f > 0)
        {   


                    pid[i]=f;
                        kill(pid[atoi(argv[i])],SIGCONT);
                        if(alarmOn)
                            {
                            printf("\nchild %s  pid: %d is executed %d\n ",argv[i+1],pid[atoi(argv[i+1])],i);
                                sleep(3);
                            }

                    kill(pid[atoi(argv[i+1])],SIGCHLD);



        }


      }
       exit(0);


return(0);
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...