gpt4 book ai didi

C linux守护进程在打开FIFO后不写入文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:26 24 4
gpt4 key购买 nike

我在 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。您可能想要使用 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 linux守护进程在打开FIFO后不写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com