gpt4 book ai didi

c - 当我创建守护进程时,fopen() 似乎不起作用

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

这是我的主要源代码:

int main(int argc, char *argv[]) {
[...]

if (become_daemon(0) == -1) {
exit(EXIT_FAILURE);
}

while (main_loop == LOOP_CONTINUE) {
[...]

if (log_data(date_temp, data_processed) < 0) {
[...]
} else {
[...]
}
sleep(measure_rate);
}
[...]
}

这里是我的函数定义:

int become_daemon(int flags) {
int maxfd, fd;

switch (fork()) {
case -1:
return -1;
case 0:
break;
default:
exit(EXIT_SUCCESS);
}

if (setsid() == -1)
return -1;

switch (fork()) {
case -1:
return -1;
case 0:
break;
default:
exit(EXIT_SUCCESS);
}

if (!(flags & BD_NO_MASK0))
umask(0);

if (!(flags & BD_NO_CHDIR))
chdir("/");

if (!(flags & BD_NO_CLOSE_FILE)) {
maxfd = sysconf(_SC_OPEN_MAX);
if (maxfd == -1)
maxfd = BD_MAX_CLOSE;

for (fd = 0; fd < maxfd; fd++)
close(fd);
}

if (!(flags & BD_NO_REOPEN_STD_FDS)) {
close(STDIN_FILENO);

fd = open("/dev/null", O_RDWR);

if (fd != STDIN_FILENO)
return -1;
if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO)
return -1;
if (dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO)
return -1;
}
return 0;
}

int log_data(char *date, double array_data[DATA_NUM]) {
FILE *file;

if ((file = fopen(DATALOG_FILE, "a")) == NULL)
return -1;

fprintf(file, "%s ; %.2f ; %.2f ; %.2f ; %.2f ; %.2f ; %.2f\n",
date, array_data[0], array_data[1], array_data[2],
array_data[3], array_data[4], array_data[5]);

fclose(file);

return 0;
}

这是我的问题:

当我使用激活的 become_daemon() 函数编译我的代码然后执行程序时,文件 DATALOG_FILE(它是 “xxxxxx. txt") 它没有被创建。如果我在没有调用 become_daemon() 函数的情况下进行编译,程序会正常运行并创建文件。

我什至注意到如果我添加这条线

sudo /my/folder/program

rc.local 中以在启动时运行它,它按照我想要的方式启动,但即使在这种情况下,它也不会创建文件 DATALOG_FILE。

我是守护进程的新手所以谁能告诉我这种行为的原因吗?

最佳答案

正如 Ctx 在他的评论中提到的,函数 become_daemon 可能会将当前目录更改为 /。如果 DATALOG_FILE 是一个相对文件名,比如你在问题中写的 "xxxxxx.txt" ,守护进程将无法在系统根目录中创建它,除非它有root权限。

要么不通过将 BD_NO_CHDIR 作为参数传递给 become_daemon 来更改当前目录,要么使 DATALOG_FILE 成为绝对路径。

关于c - 当我创建守护进程时,fopen() 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35260553/

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