apue 20130323

Rm  myhead.c swp   异常中断  

Return ;

读到文件尾   少打一个加一个=

Atoi(argv[1]+1);  

练习:编写一个函数获取文件一行

Open  read  write  close

 

Lseek();    修改文件偏移量,修改哪一段   

影响下一次读写操作   

参数1open()成功返回值 

参数2:偏移量   +1  0  -1  [ ]偏移量  +前,-后,0当前

参数3:位置   SEEK_SET  (文件开始)

             SEEK_CUR (文件当前)

             SEEK_END(文件末尾)

将文件第一个字符打印5次    read从上一次开始读

Lseek(fd,0,SEEK_SET);      文件开始

        +1  第一个

Lseek(fd,-1,SEEK_CUR);      很有用

Open()回到文件开始     打开,读写,关闭   

 

Read();   一次读出很多行     mygetline(){read();  lseek()}

 

Fd= open(fd, O_RDONLY);

Bzero(buf,sizeof(buf));

Ret = read(fd,buf,sizeof(buf)-1);

P=buf;

While ((tmp=strchr(p,'\n'))!=NULL)

{}

Mygetline(int fd,char *buf,int size);限制边界

Read (fd,buf,size);

Lseek(fd,-)80-2,SEEK_CUR);    回车是文件的一部分

 

 

Int mygeline(int fd, char *buf, int size)

{

Int ret;l

Char *p;

Bzero(buf,size);

Ret = read(fd,buf,size);

P=strchr(buf,'\n');

P++;

Bzero(p,ret-(p-buf));

Lseek(fd,-(ret-(p-buf)),SEEK_CUR);

return (p-buf);

}

 

Write();内存数据写到文件里。

提示:open(,O_WRONLY|

O_RDWR);

n行的菱形输出到文件里            如果文件不存在     

Fd = open("abc",)   文件名    O_WRONLY  |   O_TRUNC   |    O_CREAT,   0666    八进制,    二进制描述不了

Write();   也修改偏移量

目录文件上限    空间大小

参数1open()成功的返回值

参数2:地址

参数3:大小      内存———》文件里

 

Fd = open("abc",O_WRONLY | O_TRUNC | O_CREAT, 0666);

Write(fd," ",1);

Close(fd);

 

 

Write(fd,"hello",5);   write不写回车,没有   "hello"

Int i;

For ()

Close(fd);

Od  -c  abc  什么东西

 

Write();  部分写入   cp

Open();

Open();

While(1)

{

Ret = read(fdr,buf,sizeof(buf));   1024

判断= write(fdw,buf,ret);        50

}

Close();

Close();

剩下的时间不够了      部分写入

 

提高:带权限    mytt abc  bcdef   file

lseek定位     对文件内容重写

 

文件修改:

修改buf,很大

1,将文件读入内存

2,修改内存中的内容

3,将内存中的全部信息写回到文件中

4,文件变大变小?改变文件大小

 

Uesername   :passwd  (16+20)

Abc:1234  修改方便

读记录信息    read(fd,  buf, 36);

Read(36);   写回行首,不需要重写全部文件

Lseek(-36);

Write(,36);

Myuseradd  username  cp /etc/passwd    

判断   ->     拷贝到当前用户下

 

改内容:

1,重写

2,扩展空间;   

 

Open();   read();    write();    lseek();   close();

 

Dup()   dup2()   fcntl()    ioctl()

 

Fcntl:

1,修改很多东西

2,对文件上锁   用处不是很大

Fcntl  改变文件状态标志(不关闭时)

 

 

Dup()  dup() ;     文件描述的复制,两个记录指向同一文件

1,重定向

2,保存命令结果

 

Dup()

Int fd;

Int savefd;

 

Savefd=dup(1);

 

Write(1,"hello\n",6);

Write(savefd,"hello\n",6);                参数不同,功能不同

两个文件描述符指向同一文件

savefd=dup(1);      新的文件描述符

Prnitf (" ");  3  当前最小的文件描述符

 

Dup2()   

参数1     参数2  

如果参数2已经被打开,先关闭,(没有关系)

Int fd;

Fd = open("abc",O_WRONLY  |   O_TRUNC  |  O|CREAT, 0666);

Dup2(fd,1);

Write (1,  "hello\n",6);

0    stdin

1     stdout 

2     stderr

Fd 3 abc  

Dup2(fd,1);

 

hello 字符串,在屏幕上输出一下,现输出到文件中?

先输出文件,再在屏幕上输出hello

 

Int savefd;

Savefd = dup(1) ;

 

Printf ("hello");

Fflush(NULL);

Write(1,"hello\n",6);

 

Dup2(1,savefd);

Dup2(savefd,1);   恢复

 

保存结果:

Dup2(fd,1);

Printf ( " ");

Fflush(NULL);

 

Dup2(savefd,1);

Printf ("");           ls->abc    重定向

 

Fork();

{

Fd = open();

Dup2(fd,1);

Execlp("ls","ls",NULL);

System(ls);  ->   printf ("")    

}

 

POSIX:   系统调用

ANSI:   库函数

 

练习:将图形的练习使用dup2,输出到文件中.

1024 2048  4096

 

1myuseradd  username ---.>写   passwd

2mytt   abcd  bc   file    文件读写修改

 

嵌入式web

  普通文件->  html   网页      在文件里头尾加东西

  实际修改三个文件  一个目录   

/etc/shadow

/etc/groud       属于一个组

/etc/passwd

Home  名字

 

Int mygetline (int fd,char *buf, int size)

{

Int ret;

Char *p;

Bzero(buf,size);

Ret = read(fd,buf,size-1);

If (ret<=0)   return ret;

P = strchr(buf,':');

If (p==NULL)  return ret;

P++;

Bzero(p.ret-(p-buf));

Lseek(fd,)

}

 

Spirntf ("%s:x:%d:%d:/home/%s:bin/bash");

Write();

 

文件属性,目录

文件属性:获取文件属性?设置修改文件属性

Stat();    获取文件属性

文件类型不能修改

Ls  -l

-rw-rw-rw-  /root root  203   时间   a.c

类型

目录的操作

Opendir()    readdir()      closedir()

文件属性的设置

Chmod   link  chown    chgrp    atime

Truncate    rename

(改变文件大小)

练习:  

Ls   -l  -S   目录/文件    ls  -l  a.c

提高:

Mycp    复制链接文件,目录

比较两个目录是否一样

提高:目录包括子目录

编写程序:统计指定目录中所有.c文件的行数

包括子目录

 

递归  n!快速排序   树

递归的深度

1,终止条件

2,功能

3,自己调用     根/dev   (没有大小)主设备号:驱动   从设备号:驱动下

Linux  文件类型   - (touch创建) d  l   b  c  p(也没有大小内核)  s

每个进程4G    

 

Stat();

Const char *;

参数1:文件名,  open    一样

参数2:保存文件属性(地址)

       Struct stat;  (结构体)

返回值:成功失败 -1  perror

 

Struct stat *info=NULL;4个字节

Struct stat  info;

Ret=Stat ("abc",&info);

If (ret <0)

Goto stat_err;

 

Printf ("%d %s\n",info.st_size,"abc");

 

Echo  " "  >  abc

 

问题:1,文件类型

      2,文件权限  

      3,uid转为名字   用户名  getpwuid

      4,gid转为组名称赞  vi /etc/groud   getgrgid

      5,时间   月,,小时,分钟.  Ctime

                  秒数转时间

  Printf ("%d ",info.st_ctime);   ->时间

Struct passwd  *getpwuid(uidt_uid);

Pirntf ("%.12s",);   12

Printf ("-");文件类型

 

 

目录操作:

Opendir();   打开目录文件;  (文件名)

Readdir();   获取目录文件中的一条记录

Closedir();   关闭目录文件

 

Opendir():参数:目录名字   "."当前路径 ".."当前上一级

返回值  成功DIR * 失败  NULL

Readdir();参数:opendir()成功的返回值

返回值成功:struct dirnet * 

失败:NULL

 

(文件名)  d_name  我们关注的   数组长度

Closedir();关闭目录文件

参数:opendir  成功的返回值

Dp = opendir(".");

DIR *dp;

While (1)

{

Dir = readdir();

Printf ("%s\n",dir->d_name);

Readdir();

}   

Struct dirent *dir;  closedir();

 

 

 

 

原文地址:https://www.cnblogs.com/wangjingyuwhy/p/2977808.html