linux第二周

1、传递一个路径名,还有一个文件名,搜索对应路径下是否有该文件,有就打印显示,显示绝对路径。
2、传递任意一个目录路径,能够显示该目录的ls -l的效果 3、定义一个学生结构体类型struct
student,里边含有学号,姓名,分数,定义结构体数组struct student
s[3],给数组赋初值后,写入文件,然后通过lseek偏移到开头,然后再读取进行打印输出
4、新建一个文件,里边内容为hello,通过mmap映射该文件后,修改hello为world,然后解除映射

基于文件指针的文件操作

1.创建与删除目录
mkdir() rmdir()

 1 #include<func.h>                                                                         
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int ret;
  6     ret=mkdir(argv[1],0777);//默认掩码抵消2,实际为0775
  7     ERROR_CHECK(ret,-1,"mkdir");
  8     return 0;
  9 }
 1 #include <func.h>                                                                        
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int ret;
  6     ret=rmdir(argv[1]);
  7     ERROR_CHECK(ret,-1,"rmdir");
  8     return 0;
  9 }

2.给opendir(dir)打开一个目录 传递的必须是相对当前程序所在目录的路径
(1)DIR* opendir(const char* name);
(2)struct dirent* readdir(const char* name);读取目录的一项信息,并返回该项信息的结构体指针

1 #include <func.h>                                                                                                                
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     DIR* dir;
  6     dir=opendir(argv[1]);
  7     ERROR_CHECK(dir,NULL,"opendir");
  8     struct dirent *p;
  9     while(p=readdir(dir))
 10     {
 11         printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
 12     }
 13     closedir(dir);
 14     return 0;
 15 }

3.深度优先遍历 看该目录下的文件
注意路径路径拼接 每一级显示出来

1 #include <func.h>                                                                                                                
  2 
  3 int printDir(char *path,int width){
  4     DIR* dir;
  5     dir=opendir(path);
  6     ERROR_CHECK(dir,NULL,"opendir");
  7     struct dirent *p;
  8     char buf[1024]={0};
  9     while(p=readdir(dir)){
 10         if(!strcmp(p->d_name,".")||!strcmp(p->d_name,".."))
 11         {
 12             continue;
 13         }
 14         printf("%*s%s\n",width,"",p->d_name);
 15         sprintf(buf,"%s%s%s",path,"/",p->d_name);//路径拼接
 16         if(4==p->d_type)
 17         {
 18             printDir(buf,width+4);
 19         }
 20     }
 21     closedir(dir);
 22     return 0;
 23 }
   25 int main(int argc,char* argv[]){
   26     ARGS_CHECK(argc,2);
   27     puts(argv[1]);
   28     int ret=printDir(argv[1],4);
   29     return 0;
   30 } 
  1. void rewinder(DIR *dir);重新定位到目录文件的头部
    void seekdir(DIR dir);用来设置目录流目前的读取位置
    off_t telldir(DIR
    dir);返回目录流当前的读取位置 记录当时的偏移
1 #include <func.h>                                                                                                                
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     DIR* dir;
  6     dir=opendir(argv[1]);
  7     ERROR_CHECK(dir,NULL,"opendir");
  8     struct dirent *p;
  9     off_t pos;
 10     while(p=readdir(dir))
 11     {
 12         printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
 13         if(!strcmp(p->d_name,"a.out"))
 14         {
 15             pos=telldir(dir);
 16         }
 17     }
 18     seekdir(dir,pos);
 19     printf("----------------------\n");
 20     p=readdir(dir);
 21     printf("ino=%ld len=%d type=%d fileName=%s\n",p->d_ino,p->d_reclen,p->d_type,p->d_name);
 22     closedir(dir);
 23     return 0;

5.stat信息
ls -l前面的所有信息都是存在inode里面的,只有目录名字存在dirent里面
初步实现

1 #include <func.h>                                                                                                               
  2 
  3 int main(int argc,char* argv[])
  4 {
  5     ARGS_CHECK(argc,2);
  6     struct stat buf;
  7     int ret;
  8     ret=stat(argv[1],&buf);//传出参数
  9     ERROR_CHECK(ret,-1,"stat");
 10     printf("%x %ld %s %s %ld %s\n",buf.st_mode,buf.st_nlink,getpwuid(buf.st_uid)->pw_name,getgrgid(buf.st_gid)->gr_name,buf.st_size,ctime(&buf.st_mtime));
 11     return 0;
 12 }

基于文件描述符的文件操作

1.打开文件

1 #include <func.h>
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     close(fd);                                                                             
 10     return 0;
 11 }

创建文件 如果存在,则返回open失败,不存在则创建新文件

 1 #include <func.h>                                                                          
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR|O_CREAT|O_EXCL,0666);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     return 0;
 10 }

2.读写文件

 1 #include <func.h>                                                                          
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     char buf[128]={0};
 10     read(fd,buf,sizeof(buf));
 11     printf("buf=%s\n",buf);
 12     close(fd);
 13     return 0;
 14 }

  1 #include <func.h>                                                                          
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     int ret=write(fd,&fd,sizeof(int));
 10     printf("write count=%d\n",ret);
 11     return 0;
 12 }

3.改变文件大小

 1 #include <func.h>
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     int ret=ftruncate(fd,50);
 10     ERROR_CHECK(ret,-1,"ftruncate");                                                       
 11     close(fd);
 12     return 0;
 13 }

4.mmap 磁盘内存映射
用mmap时必须要用open

 1 #include <func.h>
  2 
  3 int main(int argc,char* argv[]){
  4     ARGS_CHECK(argc,2);
  5     int fd;
  6     fd=open(argv[1],O_RDWR);
  7     ERROR_CHECK(fd,-1,"open");
  8     printf("fd=%d\n",fd);
  9     char *p;
 10     p=(char*)mmap(NULL,5,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
 11     ERROR_CHECK(p,(char*)-1,"mmap");
 12     p[5]=0;
 13     printf("%s\n",p);
 14     p[0]='H';
 15     munmap(p,5);                                                                           
 16     close(fd);
 17     return 0;
 18 }

day8

1.lseek 成功返回距离文件开头的位置
fseek 成功返回0

1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 int ret=lseek(fd,5,SEEK_SET);
10 printf(“pos=%d\n”,ret);
11 char buf[128]={0};
12 read(fd,buf,sizeof(buf));
13 printf(“buf=%s\n”,buf);
14 close(fd);
15 return 0;
16 }

2.mmap munmap
不需要read write
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 char* p=(char*)mmap(NULL,5,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//NULL自动分配
10 ERROR_CHECK(p,(char*)-1,“mmap”);
11 printf("%s\n",p);
12 strcpy(p,“how”); //写入字符串替换
13 int ret=munmap(p,5);
14 ERROR_CHECK(ret,-1,“munmap”);
15 return 0;
16 }

3.fp转换为fd使用

1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 FILE* fp;
7 fp=fopen(argv[1],“rb+”);
8 ERROR_CHECK(fp,NULL,“fopen”);
9 int fd=fileno(fp);
10 printf(“fd=%d\n”,fd);
11 char buf[128]={0};
12 read(fd,buf,sizeof(buf));
13 printf(“buf=%s\n”,buf);
14 return 0;
15 }

fd转fp
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 FILE* fp;
7 int fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“fopen”);
9 fp=fdopen(fd,“rb+”);
10 ERROR_CHECK(fp,NULL,“fdopen”);
11 char buf[128];
12 fgets(buf,sizeof(buf),fp);
13 printf(“buf=%s\n”,buf);
14 return 0;
15 }

4.dup dup2 复制
dup
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 fd1=dup(fd);//复制
10 close(fd);
11
12 char buf[128]={0};
13 int ret=read(fd1,buf,sizeof(buf));
14 printf(“ret=%d buf=%s\n”,ret,buf);
15 return 0;
16 }
实现重定向标准输出

1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 printf("\n");
10 close(1);
11 fd1=dup(fd);
12 close(fd);
13 printf(“fd1=%d\n”,fd1);//不会打印到屏幕上,实现重定向标准输出
14 printf(“you can’t see me”);
15 return 0;
16 }
dup2的使用

1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,2);
6 int fd,fd1;
7 fd=open(argv[1],O_RDWR);
8 ERROR_CHECK(fd,-1,“open”);
9 printf("\n");
10 dup2(1,100);
11 fd1=dup2(fd,1);//文件描述符的复制
12 printf(“fd1=%d\n”,fd1);//不会打印到屏幕上,实现重定向标准输出
13 printf(“you can’t see me\n”);
14 dup2(100,1);
15 printf(“you can see me\n”); //打印到屏幕上,实现标准输出
16 return 0;
17 }

1 STDOUT_FILENO

5.管道文件 select
即时聊天
chat1 1)读取标准输入
2)写入管道fdw,发送给对端
3)读取管道fdr
4)打印显示
chat2
1)读取管道fdr
2)打印显示
3)读取标准输入
4)写入管道fdw,发送给对端
1 #include <func.h>
2
3 int main(int argc,char* argv[])
4 {
5 ARGS_CHECK(argc,3);
6 int fdw=open(argv[1],O_WRONLY);
7 int fdr=open(argv[2],O_RDONLY);
8 printf(“I am chat2 fdw=%d,fdr=%d\n”,fdw,fdr);
9 char buf[128]={0};
10
11 fd_set rdset;
12 int ret;
13 while(1){
14 FD_ZERO(&rdset);
15 FD_SET(STDIN_FILENO,&rdset);
16 FD_SET(fdr,&rdset);
17 ret=select(fdr+1,&rdset,NULL,NULL,NULL);//rdset是传入传出参数
18 if(FD_ISSET(STDIN_FILENO,&rdset)){
19 memset(buf,0,sizeof(buf));
20 read(STDIN_FILENO,buf,sizeof(buf));
21 write(fdw,buf,strlen(buf)-1);
22 }
23 if(FD_ISSET(fdr,&rdset)){
24 memset(buf,0,sizeof(buf));
25 read(fdr,buf,sizeof(buf));
26 printf("%s\n",buf);
27 }
28 }
29 return 0;
30 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值