1

タイトルのようにデーモン (リーダーのないデーモンのグループ) をメイン プロセスに接続しようとしましたが、問題は、各デーモン (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);
}

少なくとも私はデーモンを良い方法で作成していることについて確信が持てません..そして、後で実行できるシグナルをどこに置くべきですか?

何か提案はありますか?

4

0 に答える 0