1. 在linux內核里怎麼調用opendir和readdir
opendir和readdir等都是庫函數,想在內核中調用是不可能的。 Unix把directory看作file,
在file_operations中有readdir成員,inode_operations中有rmdir/mkdir成員。 對於具體的文件系統,
以ext3為例, 則有ext3_dir_operations和ext3_dir_inode_operations。 這些是從磁碟read
inode時初始化的。
只能說到這里了, 如果這個任務讓我實現, 我會邊讀書邊用代碼探索。。。。
2. linux中,什麼函數可以讀取目錄
LINUX下歷遍目錄的方法一般是這樣的
打開目錄-》讀取-》關閉目錄
相關函數是
opendir -> readdir -> closedir
#include <dirent.h>
DIR *opendir(const char *dirname);
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
#include <dirent.h>
int closedir(DIR *dirp);
好了,三個函數都出來了呵呵,原型就是上面,給自己解釋一下免得以後我自己忘了呵呵!我以經忘過好幾回了,所以這次放上博客來
opendir用於打開目錄,是類似於流的那種方式,返回一個指向DIR結構體的指針他的參數*dirname是一個字元數組或者字元串常量,
readdir函數用於讀取目錄,他只有一個參數,這個參數主opendir返回的結構體指針,或者叫句柄更容易理解些吧。這個函數也返回一個結構體指針 dirent *
dirent的結構如下定義
struct dirent
{
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name [NAME_MAX+1]; /* file name (null-terminated) */
}
結構體中d_ino存放的是該文件的結點數目,什麼是結點數目呢我也說不清楚了呵呵,查一下其它資料了
d_off 是文件在目錄中的編移,具體是什麼意思我也不是很明白,我很少用到它,其本上就是用到d_name short d_reclen是這個文件的長度,需要注意的是這里的長度並不是指文件大小,因為大小和長度是2回事了,你可以用lseek將文件長度移得很長,但大小其實還是那麼大.最後一個元素就是我們要的了,文件名稱!
寫了一個實例:
/**
* 功能: Linux下C語言目錄歷遍 (讀取目錄)
* 作者: 小徐
* 郵箱: [email protected]
* QQ: 339534039
* 轉載請註明出處
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
void print_usage(void);
void print_usage(void)
{
printf("Usage: test dirname\n");
}
int main(int argc,char *argv[])
{
DIR * dp;
struct dirent *filename;
if (argc < 2)
{
print_usage();
exit(1);
}
dp = opendir(argv[1]);
if (!dp)
{
fprintf(stderr,"open directory error\n");
return 0;
}
while (filename=readdir(dp))
{
printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",
filename->d_name,filename->d_ino,filename->d_reclen);
}
closedir(dp);
return 0;
}
將上面代碼保存為readdir.c執行下面的命令進行編譯測試
[root@phpos ~]# gcc readdir.c
[root@phpos ~]# ./a.out
Usage: test dirname
[root@phpos ~]# ./a.out /etc/samba/
filename:lmhosts d_info:49296 d_reclen:24s
filename:smb.conf d_info:49825 d_reclen:24s
filename:smbpasswd d_info:49402 d_reclen:24s
filename:.. d_info:47906 d_reclen:16s
filename:secrets.tdb d_info:49812 d_reclen:24s
filename:. d_info:49295 d_reclen:16s
filename:smbusers d_info:49377 d_reclen:24s
[root@phpos ~]# ./a.out /var/
filename:preserve d_info:31971 d_reclen:24s
filename:lock d_info:31966 d_reclen:16s
filename:yp d_info:31976 d_reclen:16s
filename:empty d_info:31962 d_reclen:24s
filename:run d_info:31972 d_reclen:16s
filename:lib d_info:31939 d_reclen:16s
filename:nis d_info:31969 d_reclen:16s
filename:local d_info:31965 d_reclen:24s
filename:spool d_info:31973 d_reclen:24s
filename:tmp d_info:31941 d_reclen:16s
filename:opt d_info:31970 d_reclen:16s
filename:log d_info:31959 d_reclen:16s
filename:crash d_info:31997 d_reclen:24s
filename:.. d_info:2 d_reclen:16s
filename:account d_info:32037 d_reclen:24s
filename:mail d_info:31968 d_reclen:16s
filename:cache d_info:31960 d_reclen:24s
filename:db d_info:31961 d_reclen:16s
filename:. d_info:31938 d_reclen:16s
[root@phpos ~]#
程序正常執行!到此完了呵呵!!
3. linux 為什麼while(dirp = readdir(dp) != NULL)可以實現循環讀取呢..誰能給我說
opendir和readdir的原理決定的
你可以認為 opendir後 打開的是一個文件夾,這個文件夾指向一個結構體
也就是返回的dp
而dp裡面有一個鏈表,或者數組
每次readdir就把這個數據向前移動一位,並返回當前文件節點dirp
等這個鏈表 移動到尾部,就是返回NULL,這時就代表遍歷結束了。
4. Linux,誰幫忙看看這段程序,用readdir()怎麼什麼都讀不到,路徑下是有文件的
...郁悶,調試了好半天才發現錯誤,開始都一直在看庫函數調用的問題,找了半天也沒錯,只有單步調試了,單步調試才看到錯誤,你看你的傳回目錄鏈表的節點那的判斷語句
if(dir_head=NULL)
dir_head=cur_item;
這樣傳回的值不是空才怪呢..應該是if(dir_head==NULL)
5. 在linux下的c語言編程時使用readdir的時候讀取到的「.」和「..」怎麼去掉
//跳過他們就行,例如
while ((dirp = readdir(dp)) != NULL) {
if (strcmp(dirp->d_name, ".") == 0 ||
strcmp(dirp->d_name, "..") == 0)
continue; /* ignore dot and dot-dot */
/* do something */
}
//什麼叫判斷不出來?你的具體的語句是什麼?
6. linux 下c語言利用readdir獲取文件夾目錄錯誤提示:segmentation fault~求達人看程序給解~
不說你了。
while(entry=readdir(dirpt));
這行後面有個分號發現沒,給我去掉。
這行就是個空語句。
佔位用的。可以這么理解
while(entry=readdir(dirpt))
這里啥都不幹;
下面那一行的entry 就成 NULL了,他沒有d_name,所以段錯誤
7. Linux下C語言編程用的readdir()實例
第一:linux下不成認無返回值的main方法
第二:你這個若成功,也只能夠讀取/etc/rc.d目錄下的內容
#include<sys/types.h>
#include <stdio.h>
#include<dirent.h>
#include<unistd.h>
int main(int argc,char **argv)
{
DIR * dir;
struct dirent * ptr;
int i;
if(argc==1)
dir=opendir("./");
else
dir=opendir(argv[1]);
while((ptr=readdir(dir))!=NULL)
{
printf("d_name: %s\n",ptr->d_name);//需要更詳細的信息你可以修改該句
}
closedir(dir);
return 0;
}
8. linux中readdir是按照什麼順序讀一個文件夾下的文件的
readdir是按照在磁碟上的文件索引順序讀上來的,由文件系統自動控制的。
如果想排序的話,只能自己來做。