新手求救:编写daemon_init()时,关闭所有打开的文件描述符,出错,如果解决
int daemon_init()
{
struct sigaction act;
int i, maxfd;
int lock_fd;
int ret;
char buf[100];
lock_fd=open(LOCKFILE,O_RDWR|O_CREAT,0640);
if(lock_fd<0){
printf("lockfile failed :\n");
exit(-1);
}
ret=flock(lock_fd,LOCK_EX|LOCK_NB);//因为下面关闭了,所以起不到作用
if(ret<0){
printf("can't obtaion the file lock:\n");
exit(0);
}
if (fork() != 0)
exit(0);
if (setsid() < 0)
return -1;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGHUP, &act, 0);
if (fork() != 0)
exit(0);
chdir("/");
umask(0);
setpgrp();
maxfd = sysconf(_SC_OPEN_MAX);
for (i = 0; i < maxfd; i++)
close(i);
sprintf(buf,"%6d\n",getpid());
write(lock_fd,buf,strlen(buf));
open("/dev/null", O_RDWR);
dup(0);
dup(1);
dup(2);
return 0;
}
_____________________________________________________________
maxfd = sysconf(_SC_OPEN_MAX);
for (i = 0; i < maxfd; i++)
close(i);
maxfd取到1024,但运行到close(1)就中止,不再循环,应如何解决
我看到有些人的代码是把close(i)注释掉的.有其它解决办法吗?
问题点数:100、回复次数:10Top
1 楼xpdavis(咕嘟-不想孤独)回复于 2006-06-02 13:53:32 得分 0
应该从大到小关闭比较好Top
2 楼yxustrong(yxustrong)回复于 2006-06-02 13:59:34 得分 0
还是不行,就只有close(0)可以Top
3 楼yxustrong(yxustrong)回复于 2006-06-02 14:00:54 得分 0
close关闭不存在的描述符是不是会出错的.Top
4 楼linaxing(三月三)回复于 2006-06-02 14:15:42 得分 0
你怎么知道运行到close(1)就终止了?不会是通过打印信息到标准输出吧?要知道当把标准输出(1)关了后就什么也看不到了。
另外关闭顺序应该没什么关系吧?Top
5 楼linaxing(三月三)回复于 2006-06-02 14:16:52 得分 0
close关闭不存在的描述符是会出错,但不会终止循环。Top
6 楼yxustrong(yxustrong)回复于 2006-06-02 14:26:38 得分 0
我在close(i)前后写了printf输出语句,运行到close(1)就异常退出,不再执行下面的语句。Top
7 楼yxustrong(yxustrong)回复于 2006-06-02 14:28:17 得分 0
我把0,1,2用dup打开了Top
8 楼linaxing(三月三)回复于 2006-06-02 14:35:57 得分 0
不能用printf来检查,当执行完close(1)后,printf就不会将信息打印出来了。另外将0,1,2都关闭了后在用dup()也没有意义了。还有什么叫close(1)异常退出?有何信息?
最后的办法是用gdb跟一下,看看循环关闭描述符是否执行了。Top
9 楼yxustrong(yxustrong)回复于 2006-06-02 14:39:55 得分 0
那要怎么样才能重新标准输出呢?Top
10 楼linaxing(三月三)回复于 2006-06-02 14:46:37 得分 0
...
newfd = open(...);
dup2(newfd,STDOUT_FILENO);
....
此时标准输出就被重定向到你打开的文件中。Top




