CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

新手求救:编写daemon_init()时,关闭所有打开的文件描述符,出错,如果解决

楼主yxustrong(yxustrong)2006-06-02 13:38:40 在 Linux/Unix社区 / 程序开发区 提问

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

相关问题

关键词

得分解答快速导航

  • 帖主:yxustrong

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo