2014-10-28 3 views
0

У меня есть следующая программа на C, которая должна работать как deamon и всякий раз, когда что-то записывается в FIFO, она должна записывать ее в файл.C linux daemon не записывается в файл после открытия FIFO

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <string.h> 
#include <signal.h> 
#include <syslog.h> 

#define BUF_LENGTH 255 

volatile int signal_flag = 1; 

void signal_handler(int sig) 
{ 
    signal_flag = 1; 
} 

char *getTimeString() 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 

    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    char *timeStr = asctime (timeinfo); 
    timeStr[strlen(timeStr) - 1] = 0; 

    return timeStr; 
} 

void printUsage() 
{ 
    printf("Usage: syslog_daemon PATH INTERVAL\n"); 
} 

int main(int argc, char *argv[]) 
{ 
    /* print usage */ 
    if(argc != 3) 
    { 
     printUsage(); 
     exit(EXIT_SUCCESS); 
    } 

    /* process arguments */ 
    char *logFilePath = argv[1]; 
    int interval = atoi(argv[2]); 

    /* establish the signal handler */ 
    struct sigaction action; 

    sigemptyset(&action.sa_mask); 
    action.sa_flags = 0; 
    action.sa_handler = signal_handler; 
    sigaction(SIGALRM, &action, NULL); 

    /* initialize variables */ 
    int fd; 
    /*char buf[BUF_LENGTH]; 
    int length;*/ 
    int msgs = 0; 

    /* Create FIFO if not created */ 
    if (mkfifo("/tmp/pb173_syslog", 0766) == -1 && errno != EEXIST) 
    { 
     fprintf(stderr, "Making FIFO failed with error %d\n", errno); 
     exit(EXIT_FAILURE); 
    } 

    /* Run */ 
    daemon(1, 1); 
    while(1) 
    {   
     /* Open FIFO */  
     fd = open("/tmp/pb173_syslog", O_RDONLY); 
     close(fd); 

     /* Open and write into file */ 
     FILE *f = fopen(logFilePath, "a"); 
     fprintf(f, "Daemon write: %d\n", msgs); 
     fclose(f); 


     /* Process SIGALRM and write syslog */ 
     if(signal_flag) 
     {     
      openlog("syslog_daemon v2", LOG_CONS, LOG_DAEMON); 
      syslog(LOG_INFO, "Messages written: %d\n", msgs); 
      closelog(); 

      msgs++; 

      signal_flag = 0; 
      alarm(interval); 
     } 
    } 

    return 0; 
} 

Но эта программа ничего не пишет в файл. Похоже, что когда FIFO открыт, он нигде не может писать. Но если я не открываю FIFO, программа без проблем записывает в файл. Кто-нибудь знает, в чем проблема? Спасибо за любую помощь.

+2

Ваша программа блокируется при открытом системном вызове? Если да, то убедитесь, что вы открываете fifo с обоих концов. Открытый системный вызов переходит в режим блокировки, если fifo не открыт для чтения и записи. –

+0

Вы открываете FIFO, а затем немедленно закрываете его, не читая ничего от него. Как ваш демона получает что-либо, чтобы написать вторичный файл? –

ответ

3

Он висит на open, пытаясь открыть FIFO, у которого нет второй конечной точки (писателя). Возможно, вы захотите использовать O_NONBLOCK.

Вот цитата из strace вывода, который показывает, где он висит:

$ strace -p 23114 
Process 23114 attached - interrupt to quit 
open("/tmp/pb173_syslog", O_RDONLY 

Если вы пишете что-то в FIFO (например echo test > /tmp/pb173_syslog) он разблокирует и начинает работать.

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