LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: elmar

[请教]关于close()和open()

[复制链接]
发表于 2005-1-6 16:19:56 | 显示全部楼层
Post by elmar
哦,我以为只要一个fork呢,我再看看这部分的资料去~~

其实有一个就够了
 楼主| 发表于 2005-1-6 19:13:08 | 显示全部楼层
看到一篇文章,转贴一下:

通常将一个不与任何终端相关联的后台进程定义为daemon进程。下面是通常所需的七
个步骤:

a. fork()之后父进程退出。子进程确保不是process group leader,这是成功调用
   setsid()所要求的。

b. setsid(),创建新的session和process group,成为其leader,并脱离控制终端。

c. 再次fork()之后父进程退出,子进程确保不是session leader,将永远不会重获
   控制终端。这是SVR4的特性所致。

d. chdir( "/" ),减少管理员卸载(unmount)文件系统时可能遇上的麻烦。这一步可
   选,也可chdir()到其它目录。

e. umask( 0 ),使当前进程对自己所写文件拥有完全控制权,避免继承的umask()设
   置带来困挠。这一步可选。

f. 关闭0、1、2三个句柄。许多daemon程序用sysconf()获取_SC_OPEN_MAX,并在一
   个偱环中关闭所有可能打开的文件句柄。目的在于释放不必要的系统资源,它们
   是有限资源。

g. 出于安全以及健壮性考虑,即使当前进程不使用stdin、stdout、stderr,也应重
   新打开0、1、2三个句柄,使之对应/dev/null。当然,你也可以根据需要使之对
   应不同的(伪)文件。总之,保持0、1、2三个句柄呈打开状态,并使之指向无害文
   件。
 楼主| 发表于 2005-1-6 19:20:05 | 显示全部楼层
如果要移植到windows里去,daemon进程怎么实现呢?
dos里的TSR(terminate-and-stay-resident 内存驻留程序)?
 楼主| 发表于 2005-1-6 23:23:58 | 显示全部楼层
找到了微软的一个移植guideline:
http://msdn.microsoft.com/librar ... ue#ucmgch09_topic12
发表于 2005-2-18 19:41:12 | 显示全部楼层
如果close(2)关闭了标准错误输出,如何再打开呢?
我在程序中用system调用了一个软件,软件运行时会不停的输出一些信息到stderr。
所以我在system()之前close(2),想在system()之后重新打开标准错误输出,
该如何操作?
回复 支持 反对

使用道具 举报

发表于 2005-2-19 08:13:22 | 显示全部楼层
Post by bexley
如果close(2)关闭了标准错误输出,如何再打开呢?
我在程序中用system调用了一个软件,软件运行时会不停的输出一些信息到stderr。
所以我在system()之前close(2),想在system()之后重新打开标准错误输出,
该如何操作?

一种办法是在close标准错误输出之前,用dup2()来保存它,以后需要时再把它复制回来。
另一种办法是直接打开/dev/stderr设备。
回复 支持 反对

使用道具 举报

发表于 2005-2-19 16:19:31 | 显示全部楼层

  1. dup2(2 , fd);
  2. close(2);
  3. dup2(fd , 2);
复制代码


是这个思路吗?我这里不行啊!
回复 支持 反对

使用道具 举报

发表于 2005-2-20 02:14:19 | 显示全部楼层
Post by bexley

  1. dup2(2 , fd);
  2. close(2);
  3. dup2(fd , 2);
复制代码


是这个思路吗?我这里不行啊!

没有问题呀,这是我写的代码:

  1. #include<unistd.h>
  2. #include<stdlib.h>
  3. #include<fcntl.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<stdio.h>

  7. int main()
  8. {
  9.    int sfd = 0;

  10.    /* 保存标准错误输出 */
  11.    if (-1 == dup2(STDERR_FILENO,sfd) ) {
  12.       perror("can't save fd ");
  13.       exit(1);
  14.    }

  15.   if (-1 == close(STDERR_FILENO) ) {
  16.            perror("can't close stderr");
  17.         exit(1);
  18.    }       

  19.    /* 恢复stderr */
  20.    if (-1 != dup2(sfd,STDERR_FILENO) ) {
  21.       printf("recover fd ok \n");

  22.       /* 恢复后,写入stderr应该向屏幕输出 */
  23.       write(STDERR_FILENO,"stderr ok!\n",11);
  24.    }
  25. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表