read系统调用的问题

最近在学习《The C Programming Language》的第八章第六节,这一节讲的是如何设计一个类似ls的程序。例子的思路是很好的,但是在Linux下实现却遇到一个很难解决的问题。

其中一步是读取目录文件的信息,因为懂得Linux的人都知道,Linux下面什么都是文件,目录也是文件,然后目录里的文件的信息(包括名字和节点号等)以列表的形式保存在目录文件中,所以要知道目录里到底有什么文件,就要读取目录文件。读取文件在书上的例子是用了系统调用read,在这一章其实read已经用了很多次了,我都把用法记得很熟。

然而,把源文件编译出来的结果却始终读不了目录里的信息,追踪下去,发现原来是系统调用read出了问题,read可以读很多文件,但是读不了目录文件,上网搜了一下,原来很早以前,出于安全性考虑,就已经不允许系统调用read去读取目录文件。然后搜到了一个类似的系统调用专门读目录,叫getdents调用,无奈似乎在include目录下找不到这个函数的声明。所以折腾了很久之后最终放弃了。现在,我只有放弃使用系统调用,而是利用Linux一个同名函数readdir去间接实现我的readdir了。其实,既然Linux的readdir能够实现,而且源代码又是可以看的,那么我应该找到它的实现就知道正确的系统调用是什么了。不过Linux的函数名字很多时候是define过的,要找出原来的函数的实现很烦,所以放弃了。

昨天Google的涂鸦原来不止是庆祝新年,还庆祝TCP/IP协议诞生20周年,看看底部就知道了,呵呵

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s