我有以下C语言的程序,它应该作为一个执事运行,每当有什么东西被写进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,程序就会毫无问题地写入文件。有人知道有什么问题吗?谢谢你的帮助。

最佳答案

它将挂起open试图打开一个FIFO,但该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)写入一些内容,它将解锁并开始工作。

关于c - 打开FIFO后C linux守护程序未写入文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26613887/

10-16 20:43