LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1573|回复: 17

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

[复制链接]
发表于 2005-1-5 11:14:06 | 显示全部楼层 |阅读模式

  1. int n;
  2. for (n = 0; n<3; n++) close(n);
复制代码

man page上说close() closes a file descriptor,那么0,1,2是什么的file descriptor?这个操作close掉了什么?

open("/dev/null", O_RDONLY);  //null是什么设备?
open("/dev/tty",O_RDWR);      //tty是什么设备?
发表于 2005-1-5 12:18:20 | 显示全部楼层
0, 1, 2分别是标准输入(一般为键盘),标准输出(一般为显示器或图形界面下的终端窗口)和标准错误输出

这个操作使得scanf等输入函数不再从键盘获得输入,printf等输出函数不再向显示器输出

/dev/null是“空”设备,向它写没有任何效果,从它读得到0

/dev/tty是终端设备(键盘,显示器)
 楼主| 发表于 2005-1-5 13:11:57 | 显示全部楼层
open("/dev/null", O_RDONLY);
这个一般什么情况下使用呢?
 楼主| 发表于 2005-1-5 13:47:53 | 显示全部楼层

  1.     if(fork()) exit(0);
  2.     for (n = 0; n<3; n++) close(n);
  3.     open("/dev/null", O_RDONLY);
  4.     dup2(0,1);
  5.     dup2(0,2);
  6.     if((n=open("/dev/tty",O_RDWR)) > 0) {
  7.         ioctl(n, TIOCNOTTY, 0) ;
  8.         close(n);
  9.     }
  10.     setsid();
  11.    
  12.     if(fork()) exit(0);
  13.     /* get the uid */
  14.     system_uid = getuid();
复制代码

原程序是这样的,没看明白它在子进程里做这些干什么用
 楼主| 发表于 2005-1-5 14:14:45 | 显示全部楼层
也没看明白用两次fork(),做两次daemon起什么作用
发表于 2005-1-5 14:19:00 | 显示全部楼层
  1. open("/dev/null", O_RDONLY);
  2. dup2(0,1);
  3. dup2(0,2);
复制代码


上面这个写法真的很讨厌,dev/null 被 open 并且与文件描述子 0 相关联了(因为这时 0 是最小的未被占用的描述子),相当于
  1. int fd;
  2. fd = open("/dev/null", O_RDONLY);
  3. dup2(fd, 1);
  4. dup2(fd, 2);
复制代码


两个dup2调用分别把 0 对应的描述子拷贝给 1,2
这样,以后的标准输出和标准错误输出就重定向到/dev/null了(本该显示到终端的),即使得后面的程序不再向终端上输出
发表于 2005-1-5 14:53:53 | 显示全部楼层
整个这段程序就是在创建一个daemon,第一次fork()为setsid()做准备,第二个fork()使得最后生成的进程不是会话的首进程而不能获得控制终端。
 楼主| 发表于 2005-1-5 15:16:19 | 显示全部楼层
哦,我以为只要一个fork呢,我再看看这部分的资料去~~
 楼主| 发表于 2005-1-5 17:25:57 | 显示全部楼层
为什么UNIX下的网络服务程序,如Web Server,FTP,Telnet一般都是由守护进程(Daemon)来实现?
我看的程序是一个ftp server程序
发表于 2005-1-6 10:30:55 | 显示全部楼层
首先,deamon运行起来很小的,节约资源,而且不受前面的控制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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