1、///////////////////////// 第一天 系统调用 ---目录/////////////////////////////////////////////////////////////////////// 一、设备及文件操作 linux操作系统把所有的设备都当作文件处理。linux文件类型常见的有普通文件、目录文件、设备文件、链接文件、管道文件。 ls -l crw-rw-rw- 1 root root 1, 5 07-05 08:54 zero 文件类型: - 普通文件 d
2、目录 l 链接 c 字符设备 b 块设备 p 先入先出设备(管道) u 非缓冲设备 **其中,链接分为硬链接和符号链接。对文件硬链接后,只增加了文件的引用计数,并没有物理上增加文件。 符号链接是一个物理上真实存在的文件,该文件的内容是指向被链接文件的指针。 权限 rwx chmod 777 属主属组其它 文件引用计数 文件属主 文件属组 文件大小 文件修改日期
3、 文件名 (一).目录操作 在linux中,目录是一种特殊文件,称为目录文件。 1.基本概念 工作目录:即进入系统后所在的当前目录,可以随时改变,用“.”表示,其父目录为“..” 用户目录:创建用户时创建的目录。每个用户都有自已的主目录。可以通过~引用自已的主目录。 路径:从树型目录的某个目录层次到某个文件的一条通路。各目录层次中间用/分隔 路径分为相对路径和绝对路径。 绝对路径:从根目录/开始,只有一条,是固定不变的。 相对路径:随工作目录的变化
4、而不断变化。
2.目录操作的基本函数
头文件
#include
5、 属主写权限 2 S_IXUSR 属主执行权限 1 S_IRGRP 属组读权限 S_IUGRP 属组写权限 S_IXGRP 属组执行权限 S_IROTH 其它用户读权限 S_IUOTH 其它用户写权限 S_IXOTH 其它用户执行权限 使用时,可用
6、或运算组合使用,如
S_IRUSR | SIWUSR
写可以使用数字,如
666
返回值:0 成功 -1失败。
说明:创建目录成功后,系统将在新目录下自动创建两个子目录“.”和“..”
2)删除目录
int rmdir(const char *path);
path:要删除的目录文件名称
返回值:0成功,-1失败
说明:只能用于删除空目录。
* 5)读取目录
#include
7、 DIR *opendir(const char *pathname) 读取目录,返回一个指针,返回的结构保存目录中下一个目录项的相关数据。 struct dirent *readdir(DIR *dp) 将目录的读指针重新返回到第一个目录项 void rewinddir(DIR *dp) 关闭已打开的目录项 int colsedir(DIR *dp) 4)获取工作目录 char *getcwd(char *buf,size_t size); buf:保存到工作目录名,称为缓存 size
8、缓存大小 返回值:调用成功,返回当前工作目录,否则返回NULL pathname:目录名称 dp DIR结构指针,是目录文件结构定义 struct dirent{ ino_t d_ino; //目录文件的inode节点编号 off_t d_off; //目录文件开始至目录进入点的位移 unsigned short d_reclen; //d_name的长度,不包含NULL unsigned char d_type; //d_nam
9、e所指的文件类型
char d_name[256];//文件名或目录
};
* 6)获取文件或目录状态
#include
10、ruct stat{ unsigned long st_dev; //文件所在设备的标识 unsigned long st_ino; //文件结点号 unsigned short st_mode; //文件保护模式 unsigned short st_nlink; //硬链接数 unsigned short st_uid; //文件用户标识 unsigned short st_gid; //文件用户组标识
11、 unsigned long st_rdev; //文件特殊设备标识 unsigned long st_size; //文件总大小,字节为单位 unsigned long st_blksize; //文件系统的块大小 unsigned long st_blocks; //文件分配给文件的块数量,512字节为单元 unsigned long st_atime; //文件最后访问时间 unsigned long st_atime_nse
12、c; unsigned long st_mtime; //文件最后修改时间 unsigned long st_mtime_nsec; unsigned long st_ctime; //文件最后状态改变时间 unsigned long st_ctime_nsec; }; 例:获取文件大小 struct stat mystat; fstat(fd,&mystat)
13、
int size=mystat.st_size;//文件的大小
10)文件类型获取
S_ISREG() 判断是否为普通文件
S_ISDIR() 判断是否为目录文件
S_ISCHR() 判断是否为字符特殊文件
S_ISBLK() 判断是否为块特殊文件
S_ISFIFO() 判断是否为管道或FIFO文件
S_ISLNK() 判断是否为符号链接
S_ISSOCK() 判断是否为套接字
#include 14、>
#include 15、clude 16、 if(S_ISREG(fbuf.st_mode)) printf("regular file.\n");
else if(S_ISDIR(fbuf.st_mode)) printf("directory file.\n");
else if(S_ISCHR(fbuf.st_mode)) printf("character special file.\n");
else if(S_ISBLK(fbuf.st_mode)) printf("block special file.\n");
else if(S_ISFIFO(fbuf.st_mod 17、e)) printf("fifo file.\n");
else printf("other file.\n");
//write(STDERR_FILENO,szOutBuffer,strlen(szOutBuffer));
}
3.函数应用
#include 18、 struct stat fbuf; //目录结构变量
char szOut[256];
DIR *dp = opendir(szDir); //打开目录
if (!dp)
{
return;
}
chdir(szDir); //改变工作目录到szDir
while (pDirent=readdir(dp))//循环读取目录szDir目录中的目录项
{
memset(&fbuf,0x00,sizeof(fbuf));
st 19、at(pDirent->d_name,&fbuf); //读取目录项的信息
if(S_ISDIR(fbuf.st_mode) && memcmp(pDirent->d_name,".",1)!= 0
&& memcmp(pDirent->d_name,"..",2)!= 0) //判断是否是目录,并且不是.和..
{
memset(szOut,0x00,sizeof(szOut));
sprintf(szOut,"%s/%-s",szDir,pDirent->d_name); //读取 20、目录名
write(STDOUT_FILENO,szOut,strlen(szOut));
write(STDOUT_FILENO,"\n",1);
SearchDir(szOut); //递归调用当前函数,遍历子目录
}
}
chdir(".."); //为关闭目录需要修改工作目录为非当前目录
closedir(dp); 21、 //关闭目录
return;
}
int main(int argc,char *argv[])
{
if (argc < 2) exit(1);
SearchDir(argv[1]);
return 0;
}
//---------------下午--------------------------------
(二).错误处理
1)读取错误号及错误信息
strerror(int errno) 22、
处理
int err= bind(1,NULL,2);
if (err==-1){
printf("%s\n",strerror(errno));//用英文件打印原提示信息
if (errno==EPROTONOSUPPORT) printf("汉字\n"); //获取错误号后,打印相应的提示
}
2)检查条件是否成立
#include 23、assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
#include
#include
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );
24、fp = fopen("noexitfile.txt", "r" );//以只读方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
2.时间操作函数
sleep(int s); //秒
usleep(int us); //微秒
#include 25、truct tm *locattime(time_t *timep);
timep:是time的返回值
返回值的结构:
struct tm{
int tm_sec; //秒
int tm_min; //分
int tm_hour; //时
int tm_mday; //日
int tm_mon; //月 从0算起
int tm_year; //年 从1900年算起的年 即1900年为0 01 为1
int tm_wday; //星期几
int tm_yday; //一年的第几天
};
time_t t;
time(&t); //获取系统时间
struct tm *p=localtime(&t);
printf("y=%d,m=%d,d=%d,w=%d\n",p->tm_year+1900,p->tm_mon+1,p->tm_mday,p->tm_wday);






