Связь между группой демонов и основным процессом - mkfifo

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

int main(int argc, char* argv[])
{
   pid_t pid;
   int i;
   int n = atoi(argv[1]);
   char c, message[255];
   if(argc!=2){
      printf("please insert one parametr\n");
      return -1;
   }

   int fd = open("pipe", O_RDONLY);
   if (fd == -1) {
      perror("Failed open fifo to read");
      return EXIT_FAILURE;
   }

   for( i = 0; i < n; i++) {        
      pid=fork();
      if (pid==0){
         printf("daemon created..\n");
      }
      else{
         execl("daemons", "daemons", argv[1], NULL);
         while(1){
            sleep(2);
            read(fd, message, c);           
            printf("P received: %s\n", message);
            close(fd);
            //read(fd[0], message, sizeof(message));
         }      
      }
   } 
   return 0;   
}

и вот некоторый исходный код, в котором я создаю демонов:

int fd = open("pipe", O_WRONLY);
if (fd < 0){
    perror("cannot open fifo: ");   
    return EXIT_FAILURE;
}

if ( getppid() == 1 )
    return 0;
/*  Creating daemon     */
pid[n] = fork();
if (pid[n] < 0)     
    exit(EXIT_FAILURE);  

if (pid[n] > 0)    
    exit(EXIT_SUCCESS);  
/*  Setting leader of session */
sid = setsid();  
if (sid < 0){  
    exit(EXIT_FAILURE);  
}  
/*  fork one more time to make children 
to have an opportunity to destroy
session leader  */

for ( i = 0; i < n; i++){
    pid[i] = fork();

    if(pid[i] < 0){
        printf("filed to fork...\n");    
        exit(EXIT_FAILURE);  
    }        
    if(pid[i]==0){

        while(1){                   
            sleep(2);
            printf("Demon[%d]: My ID in pipe.%d\n", i+1, getpid()); 
            signal(SIGUSR1, sigHandler);    
            write(fd, "Hi\n", strlen("Hi\n"));
            close(fd);
        }
    }       

chdir(".");

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

file = fopen("log_file.txt", "w+");

fclose(file);

umask(027);
}

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

У вас есть какие-нибудь предложения?

0 ответов

Другие вопросы по тегам