【问题标题】:I am trying to log a daemon's output to a file我正在尝试将守护程序的输出记录到文件中
【发布时间】:2014-01-10 14:21:50
【问题描述】:

我的代码如下。我正在创建一个守护进程。在此之前,我将关闭标准输出、标准输入和标准错误。并将描述符复制到我打开的文件描述符中。信号代码与问题无关。

 #include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include <fcntl.h>
#include<errno.h>
void signal_handler(int);
void main(){

int null_fd = -1;
int out_fd = -1;
int i=1;



if((null_fd = open("/dev/null", O_WRONLY)) == -1) {
    printf("Can't open /dev/null: %s\n", strerror (errno));
    exit(1);
}

if ((out_fd = open("sup.console", O_CREAT | O_WRONLY | O_APPEND, 0666)) == -1) {
    printf(" Can't open \"%s\" for stdout: %s\n", "sup.console", strerror(errno));
    exit(1);
}

close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

dup2(null_fd, STDIN_FILENO);
dup2(out_fd, STDOUT_FILENO);
dup2(out_fd, STDERR_FILENO);

    This is where I create a daemon

    if(daemon(0,0)!=0){
            printf("Couldnt become a daemon\n");
            exit(1);
    }

    if(signal(SIGUSR1,signal_handler)==SIG_ERR){
            printf("Not able to register signal");
            exit(1);
        while(i<10){
            printf("From the daemon\n");
    }
}
void signal_handler(int signum){
    if(signum==SIGUSR1){
            printf("signal caught\n");
            exit(0);
    }
 }

【问题讨论】:

  • 我在 stackoverflow 上写了一条评论 :) 说真的,发布一些实际编译但无法执行您想要的操作的代码 - 这里有不平衡的 '{' 和 '}',但我们可以'不确定这是否是你的问题......

标签: c file process operating-system daemon


【解决方案1】:

你的问题到底是什么?

来自 daemon() 手册页:

如果 noclose [第二个参数] 为零,则 daemon() 重定向标准输入、标准输出 和 /dev/null 的标准错误;否则,不会对 这些文件描述符。

因此,如果您在调用 daemon() 之前设置文件描述符,除非您在第二个参数中输入非零值,否则它们将被丢弃。

您可能还想检查 dup2 的返回值,以确保您获得了所需的 fd。

【讨论】:

  • 非常感谢。我想我没有正确阅读手册页。那正是我的问题。守护程序没有记录到日志文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2023-03-15
  • 2015-03-27
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多