Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux守护进程在打开FIFO后不写入文件_C_Linux_Daemon_Fifo - Fatal编程技术网

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

C linux守护进程在打开FIFO后不写入文件,c,linux,daemon,fifo,C,Linux,Daemon,Fifo,我有以下C语言的程序,它应该作为一个执事运行,每当有东西写入FIFO时,它应该将它写入一个文件 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义BUF_长度255 易失性int信号_标志=1; 无效信号处理器(int sig) { 信号_标志=1; } char*getTimeString() { 时间与时间; 结构tm*时间信息; 时间(&rawtime); timeinfo=localtime(&rawtime); char*timeStr=as

我有以下C语言的程序,它应该作为一个执事运行,每当有东西写入FIFO时,它应该将它写入一个文件

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义BUF_长度255
易失性int信号_标志=1;
无效信号处理器(int sig)
{
信号_标志=1;
}
char*getTimeString()
{
时间与时间;
结构tm*时间信息;
时间(&rawtime);
timeinfo=localtime(&rawtime);
char*timeStr=asctime(timeinfo);
timeStr[strlen(timeStr)-1]=0;
返回时间tr;
}
void printUsage()
{
printf(“用法:syslog_守护进程路径间隔\n”);
}
int main(int argc,char*argv[])
{
/*打印使用*/
如果(argc!=3)
{
打印用法();
退出(退出成功);
}
/*过程参数*/
char*logFilePath=argv[1];
int interval=atoi(argv[2]);
/*建立信号处理器*/
结构动作;
sigemptyset(和action.sa_mask);
action.sa_标志=0;
action.sa_handler=信号_handler;
sigaction(SIGALRM,&action,NULL);
/*初始化变量*/
int-fd;
/*字符buf[buf_长度];
整数长度*/
int-msgs=0;
/*如果未创建,则创建FIFO*/
如果(mkfifo(“/tmp/pb173_syslog”,0766)=-1&&errno!=EEXIST)
{
fprintf(stderr,“生成FIFO失败,错误为%d\n”,错误号);
退出(退出失败);
}
/*跑*/
守护进程(1,1);
而(1)
{           
/*开放式FIFO*/
fd=打开(“/tmp/pb173_syslog”,仅限O_rdo”);
关闭(fd);
/*打开并写入文件*/
FILE*f=fopen(logFilePath,“a”);
fprintf(f,“守护进程写入:%d\n”,msgs);
fclose(f);
/*处理SIGALRM并写入syslog*/
中频(信号_标志)
{                   
openlog(“syslog\u守护程序v2”,LOG\u CONS,LOG\u守护程序);
系统日志(日志信息,“写入的消息:%d\n”,msgs);
closelog();
msgs++;
信号_标志=0;
报警(间隔);
}
}
返回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\u syslog
),它将取消阻止并开始工作。

它将挂起
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\u syslog
),它将取消阻止并开始工作。

它将挂起
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\u syslog
),它将取消阻止并开始工作。

它将挂起
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\u syslog
),它将解锁并开始工作。

您的程序是否在开放系统调用时阻塞?如果是,则确保在两端打开fifo。如果fifo在读写时都未打开,则打开系统调用将进入阻塞模式。您打开fifo,然后立即关闭它,而不从中读取任何内容。您的守护进程如何将任何内容写入辅助文件?您的程序是否在开放系统调用时阻塞?如果是,则确保在两端打开fifo。如果fifo在读写时都未打开,则打开系统调用将进入阻塞模式。您打开fifo,然后立即关闭它,而不从中读取任何内容。您的守护进程如何将任何内容写入辅助文件?您的程序是否在开放系统调用时阻塞?如果是,则确保在两端打开fifo。如果fifo在读写时都未打开,则打开系统调用将进入阻塞模式。您打开fifo,然后立即关闭它,而不从中读取任何内容。您的守护进程如何将任何内容写入辅助文件?您的程序是否在开放系统调用时阻塞?如果是,则确保在两端打开fifo。如果fifo在读写时都未打开,则打开系统调用将进入阻塞模式。您打开fifo,然后立即关闭它,而不从中读取任何内容。您的守护进程如何获取要写入辅助文件的内容?