关于linux文件描述符及进程打开文件表的疑问

42 views
Skip to first unread message

xhy42...@gmail.com

unread,
Apr 29, 2014, 3:25:12 AM4/29/14
to xiyou...@googlegroups.com
一个checkpoint/restart in userspace 的项目,及用户级进程检查点

本人linux小白。。。希望能说的通俗易懂一点。。
疑问:

文件描述符是什么?

查到说是fd文件中存放着,当前进程的每个打开文件的文件描述符的信息
我还是不理解什么意思?
我的理解是:
这里的0,1,2。。就是文件描述符吗?





另外的疑惑:
为了实现进程检查点,需要对进程的打开文件表进行保存,用来在进程出现问题时恢复进程
那么我该保存哪些必要信息?文件描述符,文件读写方式,文件指针偏移量是否就够了?
我怎样得到这些信息呢?

期待您的回答。。

Cong Wang

unread,
Apr 29, 2014, 12:55:59 PM4/29/14
to xhy42...@gmail.com, 西邮Linux兴趣小组
2014-04-29 0:25 GMT-07:00 <xhy42...@gmail.com>:
>
> 一个checkpoint/restart in userspace 的项目,及用户级进程检查点
>
> 本人linux小白。。。希望能说的通俗易懂一点。。
> 疑问:
>
> 文件描述符是什么?

文件描述符就是对文件的一个抽象,就像 fopen() 打开文件后是
FILE* 一样,通过 open() 打开文件是一个整数 fd。

更详细的解释看下面的链接:
http://en.wikipedia.org/wiki/File_descriptor
http://www.bottomupcs.com/file_descriptors.html

>
> 查到说是fd文件中存放着,当前进程的每个打开文件的文件描述符的信息
> 我还是不理解什么意思?
> 我的理解是:
> 这里的0,1,2。。就是文件描述符吗?
>


是的。在内核里面它就是一个数组下标,数组存放着指向文件结构体的指针,
而 fd 就是索引。

>
>
>
>
> 另外的疑惑:
> 为了实现进程检查点,需要对进程的打开文件表进行保存,用来在进程出现问题时恢复进程
> 那么我该保存哪些必要信息?文件描述符,文件读写方式,文件指针偏移量是否就够了?
> 我怎样得到这些信息呢?

可以通过: /proc/<PID>/fdinfo/<FD>

xhy42...@gmail.com

unread,
May 1, 2014, 12:16:46 AM5/1/14
to xiyou...@googlegroups.com, xhy42...@gmail.com
谢谢你的回答!
我现在理解了文件描述符是什么
但是还有两点疑惑是:

为了恢复一个进程,其中一个模块是,在进程正常运行过程中
对其打开文件表进行保存
然后进程出错时候,创建一个新的进程,将保存的打开文件表内容
再填入新的进程的打开文件表中(这是我的思路。。)

疑惑一:
我现在不知道,对于进程的打开文件表该存储哪些东西

我的想法是
1.通过fd找到文件
通过stat(filename,struct stat *) 可以得到
    fd,filename,file_data,mode(文件类型),length(文件长度)
2.另外从 /proc/<pid>/fdinfo/<FD>中可以得到 pos(指针偏移量) 和 flags(文件标志)

查阅了一些资料
貌似还需要对struct termios 和struct fcntl_data_t这个两个东西进行保存...
想咨询一下您,这两个是什么?需要保存并恢复吗?

疑惑二:
我该怎么将保存的内容写入到一个新的进程的打开文件表中

希望您能抽空帮我解答一下。。谢谢!!!

在 2014年4月30日星期三UTC+8上午12时55分59秒,Américo Wang写道:

Cong Wang

unread,
May 2, 2014, 1:14:26 AM5/2/14
to xhy42...@gmail.com, 西邮Linux兴趣小组
2014-04-30 21:16 GMT-07:00 <xhy42...@gmail.com>:
> 谢谢你的回答!
> 我现在理解了文件描述符是什么
> 但是还有两点疑惑是:
>
> 为了恢复一个进程,其中一个模块是,在进程正常运行过程中
> 对其打开文件表进行保存
> 然后进程出错时候,创建一个新的进程,将保存的打开文件表内容
> 再填入新的进程的打开文件表中(这是我的思路。。)
>
> 疑惑一:
> 我现在不知道,对于进程的打开文件表该存储哪些东西


这取决于文件的类型。普通文件可能只是 pos,length等,
而 socket 就复杂了,比如 TCP socket 至少还需要 (srcIP, srcPort,dstIP, dstPort)
等连接相关的信息。

>
> 我的想法是
> 1.通过fd找到文件
> 通过stat(filename,struct stat *) 可以得到
> fd,filename,file_data,mode(文件类型),length(文件长度)
> 2.另外从 /proc/<pid>/fdinfo/<FD>中可以得到 pos(指针偏移量) 和 flags(文件标志)
>
> 查阅了一些资料
> 貌似还需要对struct termios 和struct fcntl_data_t这个两个东西进行保存...
> 想咨询一下您,这两个是什么?需要保存并恢复吗?

termios 应该是 tty 相关的信息,你可以自行 google 一下。
fcntl 应该是通过 fcntl() 设置的信息,比如 NONBLOCK。


>
> 疑惑二:
> 我该怎么将保存的内容写入到一个新的进程的打开文件表中
>

做一个逆操作,比如 fcntl(GETFL...) 得到的信息就通过 fctnl(SETFL) 写回去。

xhy42...@gmail.com

unread,
May 8, 2014, 8:54:18 AM5/8/14
to xiyou...@googlegroups.com, xhy42...@gmail.com

对于打开文件表目前做了粗略的保存,
现在想实现对进程信号的保存
参考的论文里面涉及到几个不知道是不是系统调用的函数,想向您咨询一下
char* backup_up(pid_t, void* )
int do_syscall(pid_t,struct user_regs_struct)
memcpy_from_target(pid_t,struct k_sigaction,void*,long\int)
restore_page(pid_t,void*,char*)

不知道这几个是不是系统调用,是什么功能?
若是可以,希望您能解答一下
谢谢!
在 2014年5月2日星期五UTC+8下午1时14分26秒,Américo Wang写道:
Reply all
Reply to author
Forward
0 new messages