我的代码如下。我正在创建一个守护进程。在此之前,我正在关闭标准,std in和std err。并将描述符复制到我打开的文件描述符中。信号代码与问题无关。
#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);
}
}
答案 0 :(得分:1)
你究竟是什么问题?
来自daemon()手册页:
如果noclose [第二个参数]为零,则守护进程()重定向标准输入,标准输出 和/ dev / null的标准错误;否则,不会进行任何更改 这些文件描述符。
因此,如果在调用守护进程()之前设置文件描述符,除非在第二个参数中放入非零值,否则它们将被删除。
您可能还想检查dup2的返回值,以确保获得所需的fd。