linux高级编程(文件操作)

linux高级编程(文件操作)
linux高级编程(文件操作)

文件及设备操作

1.基本概念

linux下文件操作的两种方法:原始文件I/O、标准I/O库

标准I/O库: 是C语言的标准输入输出库,是针对流对象FILE 进行的操作,是带缓存的。

原始I/O库:是linux系统提供的文件API,是针对描述描进行的操作,是无缓存机制。

文件描述符:创建一个新文件或打开现有文件时,内核向进程返回的一个非负整数。

其范围在0~OPENMAX之间,OPENMAX是一个宏,不同linux版本取值不同.

系统调用:是操作系统提供的某些功能的接口(函数)

常用设备

/dev/null 空设备,丢弃数据用

/dev/port 存取I/O端口

/dev/ttyN N(0 1 ...) 字符终端

/dev/sdaN N(0 1...) SCSI磁盘

/dev/scdN N(0 1...) SCSI光驱

/dev/mouseN N(0 1...) 鼠标

/dev/socksys 套接字访问端口接口,用于网络传输

/dev/route 路由器控制设备

/dev/fbN N(0 1...) 帧缓冲设备(frame buffer) 重点

/dev/mixer 混音器音量控制、混音控制重点

/dev/dsp 声卡数字采样和数字录音设备用于播放声音和录音经常使用重点(oss)

/dev/audio 声卡音频设备用于播放声音和录音,支持sun音频较少使用

/dev/video 视频摄像头用于视频采样(录像)

常用头文件

#include 对外提供的各种数据类型如size_t

#include 对外提供的各种结构类型如time_t

#include 对外提供的各种错误号的定义用数字代码的错误类型

#include 文件控制的函数定义

#include 串口的结构及定义

#include 声卡的结构及定义

#include 设备控制函数

#include 在C++内加入的头

2.设备的操作函数

#include

#include

#include

#include

#include

1)Access

功能: 确定文件的访问权限

用法: int access(const char *filename, int amode);

finename 文件名称mode 模式,共5种模式:

0-检查文件是否存在

1-检查文件是否可运行

2-检查文件是否可写访问

4-检查文件是否可读访问

6-检查文件是否可读/写访问

例:判断文件是否存在

int file_exists(char *filename){

return (access(filename, 0) == 0);

}

2)创建文件

int creat(char *pathname,mode_t mode);

pathname:要创建文件的路径文件名。可以使用绝对路径或相对路径。

mode: 新建文件的访问权限,同创建目录

使用时,可用或运算组合使用,如

S_IRUSR | SIWUSR

写可以使用数字,如

666

返回值:成功,返回文件描述符,失败-1

说明:

3)打开文件

int open(const char *pathname, int oflag,mode_t mode);

pathname: 设备或文件名

flags: 文件的打开方式,可以用位运算|组合

O_RDONL Y 只读

O_WRONL Y 只写

O_RDWR 读写模式

O_APPEND 追加模式

O_CREAT 创建文件

O_SYNC 同步。

O_NONBLOCK 非阻塞模式,默认为阻塞模式

O_EXCL 如果定义了O_CREAT,且文件已存在,则出错

O_TRUNC 如果文件存在,且以只读或指写方式打开,则截断文件mode: 可选参数,用于定义新建文件的访问权限,同creat函数

返回值:成功文件描述符失败-1

注:O_RDONL Y、O_WRONL Y、O_RDWR中只能选择一个,然后通过|运算和其它选项组合

O_EXCL与O_CREAT组合实现互斥,文件已存在的情况下,调用失败。

O_WRONL Y|O_CREAT|O_TRUNC组合,则与creat函数等价

对于设备文件,不能使用O_CREAT选项

例:int fd=open("./test.txt",O_CREAT | O_RDWR | O_SYNC);//文件

int fd=open("/dev/dsp",O_RDWR | O_SYNC); //设备

4)文件读写

ssize_t write(int filedes,void *buff, size_t nbytes);

ssize_t read(int filedes,void *buff, size_t nbytes);

filedes: 文件描述符

buff:内存地址,如果用write,则先在buff内填写数据

如果用read,则先准备好一个内存,等待填写

nbytes:要读写的字节数

返回值:成功是实际的读写长度失败-1

注:read、write不仅用于读取文件,而且用于套接字、设备等。

5)文件的关闭

int close(int filedes);

6)文件的删除

int unlink(const char * path)

说明:只是将文件的引用计数减一,只有在引用计数变为0的情况下,才会删除物理文件

7)移动文件指针

off_t lseek(int fd,off_t offset,int whence);

fd:文件描述符

offset: 文件偏移量,是相对于whence的偏移

whence: 文件偏移的起始位置

SEEK_SET 文件头

SEEK_CUR 当前位置

SEEK_END 文件尾开始

返回值:成功,返回新的当前文件指针位置,失败-1

8)设备控制(设置)

#include

int ioctl(int d, int request, ...);

d: 文件枸柄(描述符)

request:用户程序对设备的控制命令,后面的省略号,是补充参数,一般最多一个

返回值:成功0 失败-1

例:int fd=open("/dev/dsp",O_RDWR); //打开设备

int format=8; //音频采样大小

int err=ioctl(fd,SNDCTL_DSP_SETFMT,&format);

//SNDCTL_DSP_SETFMT // 是在soundcard.h头文件定义的宏,代表设置音频位数

//&format//音频位数变量的地址

int speed=44100

int err=ioctl(fd,SNDCTL_DSP_SPEED,&speed);

//SNDCTL_DSP_SPEED // 代表设置音频频率

//&speed//频率的值

ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。

所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。

Linux Kernel中提供了一些宏,这些宏标明这个命令对应的设备类型、设备序列号、数据传送方向和数据传输尺寸。

不同的设备都有一组相应宏,需要根据不同设备的说明进行使用

3.函数应用

文件操作的流程

open -> [ioctl] -> write(read)->close

其中ioctl用于设置设备,可根据情况使用

1)标准输入、标准输出、标准错误输出

在linux进程启动时,内核默认为每个进程打开3个文件:标准输入文件、标准输出文件、标准错误输出文件。

这三个文件也分配了文件描述符,分别为0、1、2

标准输入文件被映射至键盘

标准输出文件和标准错误输出文件被映射至监视器

对这三个文件的描述符可以使用直接数字,也可以使用它们的宏定义:STDIN_FILENO、STDOUT_FILENO、STDDERR_FILENO

例:用标准输入输出进行读写(即scanf和printf)

#include

int main(){

char buf[256];

int size=read(0,buf,256); //0是标准输入描述符

printf("-------------%d\n",size);

write(1,buf,size); //1是标准输出描述符

}

2)对普通文件的操作

#include

#include

#include

#include

#include

#include

#include

//#include 在C++内加入的头

例1:创建文件,并写入数据

int main(int argc,char **argv){

int fd=open("./test.txt",O_CREAT | O_RDWR);

if (fd==-1) {

printf("open err\n");

return 0;

}

char buf[256]="aaaaaaaaaaaaaaaaaaaaaa";

ssize_t size=write(fd,buf,strlen(buf));

printf("size=%d,len=%d\n",size,strlen(buf));

close(fd);

return 0;

}

例2:将一个文件内的数据写入到另一个文件

int main(int argc,char **argv){

int desfd=open("./new.txt",O_CREAT | O_WRONL Y);

if (desfd==-1) {

printf("open err\n");

return 0;

}

int srcfd=open("./test.txt",O_RDONL Y);

if (srcfd==-1) {

printf("open err\n");

return 0;

}

int filelen=lseek(srcfd,0,SEEK_END);

lseek(srcfd,0,SEEK_SET);

char buf[256];

int len,size=0;

while(size

len=read(srcfd,buf,1);

len=write(desfd,buf,len);

size+=len;

}

close(srcfd);

close(desfd);

return 0;

}

3).音频设备操作

声卡支持的所有采样格式可以在头文件soundcard.h中找到

设置采样时的声道数目SNDCTL_DSP_STEREO 0代表1声道1代表2声道

设置采样时的频率SNDCTL_DSP_SPEED 8000 11025 12000 22050 37800 44100 设置采样大小SNDCTL_DSP_SETFMT 8 16

#include

#include

#include

#include

#include

#include

#include

#include

#include

static int isstop=1;

static int ispause=0;

void setvol(int lvol,int rvol){

int fd=open("/dev/mixer",O_RDWR);

short vol=(lvol<<8 | rvol); //音量,用16位整数记录左右声道音量

//ioctl(fd,MIXER_READ(SOUND_MIXER_VOLUME),&vol);//读音量

ioctl(fd,MIXER_WRITE(SOUND_MIXER_VOLUME),&vol);//设音量

close(fd);

//lvol 1 0000001

// 0000000100000000

//rvol 2 0000010

// 0000000100000010

}

void getvol(int lvol,int *rvol){

int fd=open("/dev/mixer",O_RDWR);

short vol=(lvol<<8 | rvol); //音量,用16位整数记录左右声道音量

ioctl(fd,MIXER_READ(SOUND_MIXER_VOLUME),&vol);//读音量

//ioctl(fd,MIXER_WRITE(SOUND_MIXER_VOLUME),&vol);//设音量

close(fd);

//lvol 1 0000001

// 0000000100000000

//rvol 2 0000010

// 0000000100000010

void plays(int b,int c,int s,char *file){

int i,bits=b;

int channels=c;

int speed=s;

char filename[256];

strcpy(filename,file);

//////////////////////////////////////////////////////////

int dsp_fd=open("/dev/dsp",O_RDWR);

if (dsp_fd==-1) return ;

ioctl(dsp_fd,SNDCTL_DSP_STEREO,&channels);

ioctl(dsp_fd,SNDCTL_DSP_SETFMT,&bits);

ioctl(dsp_fd,SNDCTL_DSP_SPEED,&speed);

int fd=open(filename,O_RDONL Y);

int size=lseek(fd,0,2);

lseek(fd,0,0);

char buf[256];

for(i=0;i

if(isstop) break;

while (ispause) usleep(50000);

printf("%d ",i);

int len=read(fd,buf,256);

write(dsp_fd,buf,256);

i+=len;

}

close(fd);

close(dsp_fd);

}

int main(int argc,char **argv){

int i,bits=8; //采样大小

int channels=1; //0单声道,1双声道

int speed=44100; //8k 11.025k 12k 22.05k 37.8k 44.1k char filename[256];

strcpy(filename,"./audio1.wav");

for(i=0;i

if (strcmp(argv[i],"-b")==0)

bits=atoi(argv[i+1]);

else if (strcmp(argv[i],"-c")==0)

channels=atoi(argv[i+1]);

else if (strcmp(argv[i],"-s")==0)

speed=atoi(argv[i+1]);

else if (strcmp(argv[i],"-f")==0)

strcpy(filename,argv[i+1]);

}

plays(bits,channels,speed,filename);

return 0;

}

S=R(采样频率Hz )×D(录音时间)×r(量化位数(位)) ×声道数/8 s: 字节;R:HZ;D:录音时间S;r:量化位数bit

Linux常用命令

Linux常用命令1、查看当前工作路径:pwd 示例: 2、列出目录中的内容:ls 格式: ls [选项] [目录名称] 常用选项和参数: -l :显示文件和目录的详细信息。 -d : 显示目录名称而非其内容。 -S : 按文件和目录的大小排序。 -t : 按文件和目录的更改时间排序。 -a :显示目录中的文件和文件夹,包括隐藏文件。 示例: ?查看当前目录下的文件和文件夹详细信息。 3、切换工作目录:cd 格式: cd [目录名称] (直接执行cd命令,进入个人主目录。)示例:

4、创建目录:mkdir 格式: mkdir [选项] [目录名称] 常用选项和参数: -p :确保目录名称存在,如果目录不存在的就新创建一个。 示例: ?在/test/test1目录下创建一个名称为“test2”的目录。(/test目录下还没有创建test1,添加-p参数一次性创建) 5、创建文件:touch 格式: touch [文件名称] 示例: ?创建一个名称为“linux”的文件。 6、删除文件或目录:rm 格式: rm [选项] [文件或目录名称] 常用选项和参数: -f :强制删除文件或目录。 -r :递归处理,将指定目录下的所有文件及子目录一并处理。 示例: ?删除一个名称为“/test1”的目录。

7、移动或更名现有的文件或目录:mv 格式: mv[选项][源文件或目录][目标文件或目录] 常用选项和参数: -f :若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录。 示例: ?将/etc/hosts文件移动到/home目录。 8、复制文件或目录:cp 格式: cp[选项][源文件或目录][目标文件或目录] 常用选项和参数: -a :此参数的效果和同时指定"-dpR"参数相同。 -d :当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。 -p :保留源文件或目录的属性。 -R :递归处理,将指定目录下的所有文件与子目录一并处理。 示例: ?复制/var/log/messages文件到/home目录。 cp /var/log/messages /home ?复制/var/log文件夹到/home目录。 cp -a /var/log /home

实验 Linux文件和目录操作

实验Linux文件和目录操作(1) 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间

Linux文件系统分析

Linux文件系统分析 一、什么是文件系统 . 文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点;一旦文件系统被挂载。文件系统是在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区组织文件的方法,如NTFS或FAT;文件系统涉及两个非常独特的事情,目录树或在磁盘或分区上文件的排列;文件系统是基于操作系统的,建立在磁盘媒质上的可见体系结构,例如这种结构对于一个Unix用户来说可以用ls 或其它工具可以看到;文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命名、存储、组织及取出的方法;在计算机业,一个文件系统是有组织存储文件或数据的方法,目的是易于查询和存取。文件系统是基于一个存储设备,比如硬盘或光盘,并且包含文件文件物理位置的维护;也可以说文件系统也是虚拟数据或网络数据存储的方法。 二、常见的文件系统 Linux系统核心支持十多种文件系统类型:jfs、 ReiserFS、ext、ext2、ext3、iso9660、xfs、 minx、msdos、umsdos、Vfat、NTFS、Hpfs、Nfs、smb、sysv、proc等。这里我们对最常用的几个文件系统的发展情况和优缺点作详细介绍:ext、ext2、ext3、jsf、、xfs、ReiserFS。一、 ext ext是第一个专门为Linux的文件系统类型,叫做扩展文件系统。它在1992年4月完成的。它为Linux的发展取得了重要作用。但是在性能和兼容性上存在许多缺陷。现在已经很少使用了。二、 ext2 ext2是为解决ext文件系统的缺陷而设计的可扩展的高性能的文件系统。又被称为二级扩展文件系统。它是在1993年发布的,设计者是Rey Card。ext2是Linux文件系统类型中使用最多的格式。并且在速度和CPU利用率上较突出,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。Ext2 可以支持256字节的长文件名,其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的Intel x86兼容处理器的系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 6384GB。尽管Linux可以支持种类繁多的文件系统,但是2000年以前几乎所有的Linux发行版都用ext2作为默认的文件系统。 ext2的缺点:ext2的设计者主要考虑的是文件系统性能方面的问题。ext2在写入文件内容的同时并没有同时写入文件的meta-data (和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的meta- data。这样若出现写入文件内容之后但在写入文件的meta-data之前系统突然断电,就可能造成在文件系统就会处于不一致的状态。在一个有大量文件操作的系统中出现这种情况会导致很严重的后果。另外但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,尽管文件系统的容量上限为 6384G但是实际上能使用的文件系统容量最多也只有 2048GB。三、 ext3 ext3是由开放资源社区开发的日志文件系统,主要开发人员是Stephen tweedie。ext3被设计成是ext2的升级版本,尽可能地方便用户从ext2fs向ext3fs迁移。ext3在ext2的基础上加入了记录元数据的日志功能,努力保持向前和向后的兼容性。这个文件系统被称为ext2

linux查看文件大小命令

linux查看文件大小命令 linux系统不像windows系统,查看文件可以随时点击右键,linux中碳钢命令来查看文件大小,下面由小编为大家整理了linux查看文件命令的相关知识,希望对大家有帮助! linux查看文件命令详解 du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-depth=<目录层数>][--help][--version][目录或文件] 常用参数: -a或-all 为每个指定文件显示磁盘使用情况,或者为目录中每个文件显示各自磁盘使用情况。 -b或-bytes 显示目录或文件大小时,以byte为单位。 -c或–total 除了显示目录或文件的大小外,同时也

显示所有目录或文件的总和。 -D或–dereference-args 显示指定符号连接的源文件大小。 -h或–human-readable 以K,M,G为单位,提高信息的可读性。 -H或–si 与-h参数相同,但是K,M,G是以1000为换算单位,而不是以1024为换算单位。 -k或–kilobytes 以1024 bytes为单位。 -l或–count-links 重复计算硬件连接的文件。 -L<符号连接>或–dereference<符号连接> 显示选项中所指定符号连接的源文件大小。 -m或–megabytes 以1MB为单位。 -s或–summarize 仅显示总计,即当前目录的大小。

1_Linux C 文件与IO操作

Linux 文件与I/O操作 Andrew Huang 课程内容 l系统调用 l底层库函数 l标准库函数 l目录与文件维护 系统调用 l Linux 大部分的系统功能是通过系统调用(System Call)来实现的.如open,send之类. l这些函数在C程序调用起来跟标准C库函数(printf…)非常类似.但是实现机制完全不同. l库函数仍然是运行在Linux 用户空间程序.很多时候内部会调用系统调用. l但系统调用是内核实现的.在C库封装成函数.但通过系统软中断进行调用. –用time命令测试时间,系统时间实际就是系统调用时间累积 l time ./demo1 –用strace 可以跟踪一种程序系统调用使用情况 l strace ./demo1 #不需要调试信息 两者关系 l可以参考C库函数malloc与系统调用sbrk的关系

常见C标准库函数 l printf,getch,scanf l strcpy,strcmp,strlen l memcpy,memcmp,memset l fopen,fwrite,fread 常见系统调用函数 l进程控制:fork(),waitpid() l文件控制open(),write() l网络收发函数socket(),bind(),send(),write() l权限控制 access() l标准C的函数,应该在MSDN和Linux下的man都能同时查找联机帮助 –并且声明定义在stdlib.h当中 l而Linux系统调用只能用man查找相应帮助 –大部分声明定义在unistd.h当中 文件控制 1. Linux文件结构 l Linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而统一的接口.在Linux中,一切(或几乎一切)都是文件。 l通常程序完全可以像使用文件那样使用磁盘文件、串行口、打印机和其他设备。 l大多数情况下,你只需要使用五个基本的函数——open、close、read、write和ioctl l Linux中的任何事物都可以用一个文件代表,或者可以通过特殊的文件进行操作。 l一些特殊文件 –目录 –设备文件 –/dev/console –/dev/tty –/dev/null 2. 底层库函数 l Linux 在底层实现一整套处理文件函数. –这一些函数能处理普通文件,网络socket文件,设备文件等 –全部是系统调用实现的函数 l文件处理函数 –open –打开或创建一个文件 –creat –建立一个空文件 –close –关闭一个文件 –read –从文件读入数据 –write –向文件写入一个数据 –lseek –在文件中移动读写位置

C语言文件流操作函数大全

clearerr(清除文件流的错误旗标) 相关函数feof 表头文件#include 定义函数void clearerr(FILE * stream); 函数说明clearerr()清除参数stream指定的文件流所使用的错误旗标。 返回值 fclose(关闭文件) 相关函数close,fflush,fopen,setbuf 表头文件#include 定义函数int fclose(FILE * stream); 函数说明fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。 返回值若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。错误代码EBADF表示参数stream非已打开的文件。 范例请参考fopen()。 fdopen(将文件描述词转为文件指针) 相关函数fopen,open,fclose 表头文件#include 定义函数FILE * fdopen(int fildes,const char * mode); 函数说明fdopen()会将参数fildes 的文件描述词,转换为对应的文件指针后返回。参数mode 字符串则代表着文件指针的流形态,此形态必须和原先文件描述词读写模式相同。关于mode 字符串格式请参考fopen()。 返回值转换成功时返回指向该流的文件指针。失败则返回NULL,并把错误代码存在errno 中。 范例 #include main() { FILE * fp =fdopen(0,”w+”); fprintf(fp,”%s\n”,”hello!”); fclose(fp); } 执行hello! feof(检查文件流是否读到了文件尾) 相关函数fopen,fgetc,fgets,fread 表头文件#include 定义函数int feof(FILE * stream);

(完整版)linux文件系统管理-权限管理实验4报告

实验报告 课程Linux系统应用与开发教程实验名称linux文件系统管理-权限管理(高级设置) 一、实验目的 1、掌握Linux文件系统权限的设置 2、掌握linux用户帐号与组管理 3、掌握linux 文件共享的设置方法 4、掌握linux 文件共享的权限设置方法 二、实验内容 1、使用root帐号通过系统提供的6个虚拟控制台登陆到linux,或在x-windows开启一个终端。 2、完成以下的实验内容 (1)、假设你是系统管理员:现要在公司linux服务器系统中新增一些用户与一个用户组。 ?使用groupadd account 添加一个名为account的组 ?使用useradd -G account acc-user1,(该命令将添加一个用户名为acc-user1的用户, 同时会建立一个与用户名同名的私有组(该私有组为用户的默认组,这个组中只有一个用户名),并把该用户将加入account的标准组,同时,按同样的方法建立acc-user2、acc-user3、acc-user4。 ?建立用户后,请使用x-window中的用户与组管理工具查看用户与组建立情况,检查用户与组的归属情况。 (2)、开启多个控制台,分别使用acc-user1、acc-user2、acc-user3登陆系统(可以在控制台分别登陆,也可以在X-windows中多开几个终端程序,默认使用root登陆,然后使用su命令通过切换用户的方式登陆,其语法为“su - user-name”,提示可以在登陆成功后运行命令“id”查看当前登陆的用户属于哪些组,当前的默认组是什么?) (3)、为account组建立一个公共共享目录/home/account-share,满足以下的权限设定要求,以及设置何种的umask: ?该目录的拥有者为acc-user1,所属组为account。 ?在该目录下建立一个/home/account-share/full-share的子目录,修改该目录的权限,使得account组的成员均能在对该目录有完全控制权限,account组外的其他用户没有任何权限,即account组的成员都可以在该目录下建立文件,同时在该子目录full-share下建立的文件,只有文件建立者有权限删除,并且每个用户在该子目录full-share下建立的文件也能自动与该account组成员可读共享。 ?在/home/account-share/为每个用户建立一个与用户名同名的子目录(如/home/account-share/acc-user1为用户acc-user1的目录,其拥有者为acc-user1,所在的组为account),配置该子目录的拥有者有完全控制权限,而同组用户只能读取,同时在用户在该目录下建立的文件,可供同组用户读。 (4)、考虑完成以上的共享目录权限设置,应注意哪些设置。包括目录的权限,目录的拥有者,目录所在的组,具体文件的权限,umask设置等。 (5)、实验报告应体现出使用不同身份的用户对所配置目录的访问测试过程。 三、实验环境 安装有vmware或visual pc软件的window主机,系统中有提供turbolinux或redhat的硬盘

linux高级编程(文件操作)

文件及设备操作 1.基本概念 linux下文件操作的两种方法:原始文件I/O、标准I/O库 标准I/O库: 是C语言的标准输入输出库,是针对流对象FILE 进行的操作,是带缓存的。 原始I/O库:是linux系统提供的文件API,是针对描述描进行的操作,是无缓存机制。 文件描述符:创建一个新文件或打开现有文件时,内核向进程返回的一个非负整数。 其范围在0~OPENMAX之间,OPENMAX是一个宏,不同linux版本取值不同. 系统调用:是操作系统提供的某些功能的接口(函数) 常用设备 /dev/null 空设备,丢弃数据用 /dev/port 存取I/O端口 /dev/ttyN N(0 1 ...) 字符终端 /dev/sdaN N(0 1...) SCSI磁盘 /dev/scdN N(0 1...) SCSI光驱 /dev/mouseN N(0 1...) 鼠标 /dev/socksys 套接字访问端口接口,用于网络传输 /dev/route 路由器控制设备 /dev/fbN N(0 1...) 帧缓冲设备(frame buffer) 重点 /dev/mixer 混音器音量控制、混音控制重点 /dev/dsp 声卡数字采样和数字录音设备用于播放声音和录音经常使用重点(oss) /dev/audio 声卡音频设备用于播放声音和录音,支持sun音频较少使用 /dev/video 视频摄像头用于视频采样(录像) 常用头文件 #include 对外提供的各种数据类型如size_t #include 对外提供的各种结构类型如time_t #include 对外提供的各种错误号的定义用数字代码的错误类型 #include 文件控制的函数定义 #include 串口的结构及定义 #include 声卡的结构及定义 #include 设备控制函数 #include 在C++内加入的头 2.设备的操作函数 #include #include #include #include #include 1)Access

nodejs文件操作模块FS(File System)常用函数简明总结

nodejs文件操作模块FS(File System)常用函数简明总结 件系统操作相关的函数挺多的。首先可以分为两大类。 一类是异步+回调的。一类是同步的。 在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可 1.首先是一类最常规的读写函数,函数名称和形式,应该是起源于C语言的。 复制代码代码如下: fs.open(文件路径,读写标识,[文件mode值,666],回调函数(err,文件句柄fd)); fs.read(文件句柄fd,被写入的buffer,offset,length,position,回调函数(err,bytesRead,buffer)); fs.write(文件句柄fd,被读取的buffer,offset,length,position,回调函数(err,bytesWritten,buffer)); fs.close(文件句柄,回调函数) fs.truncate(文件句柄,截断长度,回调函数); fs.fsync(文件句柄,回调函数); 2.直接对文件进行读写的,用起来比较方便。 复制代码代码如下: fs.readFile(文件名,编码,回调函数(err,data)); fs.writeFile(文件名,数据,编码,回调函数(err)); fs.appendFile(文件名,数据,编码,回调函数(err)); 3.其它常用文件操作 复制代码代码如下: 判断文件是否存在 fs.exists(文件路径,callback(是否存在)); 重命名 fs.rename(旧文件名,新文件名,回调函数); 文件所有者变更 fs.chown(文件名,uid,gid,回调函数);/fs.fchown(文件句柄fd,uid,gid,回调函数);/fs.lchown(链接路径,uid,gid,回调函数); 文件权限变更 fs.chmod(文件名,mode,回调函数);/fs.fchmod(文件句柄,mode,回调函数);/fs.lchmod(链接路径,mode,回调函数); 文件信息 fs.stat(文件路径,回调函数(err.fs.Stats对象));/fs.fstat(文件句柄fd,回调函数(err.fs.Stats对象));/fs.lstat(链接路径,回调函数(err.fs.Stats对象)); 文件时间 fs.utimes(文件路径,访问时间,新建时间,回调函数);/fs.futimes(文件句柄,访问时间,新建时间,回调函数); 监视文件 fs.watchFile(文件名,[options],listener_callback(当前文件的stats,改变前的stats)); fs.unwatchFile(文件名); 4.目录操作 复制代码代码如下: fs.mkdir(路径,权限mode/777,回调函数); fs.rmdir(路径,回调函数);

Linux 0.1.1文件系统的源码阅读

Linux 0.11文件系统的源码阅读总结 1.minix文件系统 对于linux 0.11内核的文件系统的开发,Linus主要参考了Andrew S.Tanenbaum 所写的《MINIX操作系统设计与实现》,使用的是其中的1.0版本的MINIX文件系统。而高速缓冲区的工作原理参见M.J.Bach的《UNIX操作系统设计》第三章内容。 通过对源代码的分析,我们可以将minix文件系统分为四个部分,如下如1-1。 ●高速缓冲区的管理程序。主要实现了对硬盘等块设备进行数据高速存取的函数。 ●文件系统的底层通用函数。包括文件索引节点的管理、磁盘数据块的分配和释放 以及文件名与i节点的转换算法。 ●有关对文件中的数据进行读写操作的函数。包括字符设备、块设备、管道、常规 文件的读写操作,由read_write.c函数进行总调度。 ●涉及到文件的系统调用接口的实现,这里主要涉及文件的打开、关闭、创建以及 文件目录等系统调用,分布在namei和inode等文件中。 图1-1 文件系统四部分之间关系图

1.1超级块 首先我们了解一下MINIX文件系统的组成,主要包括六部分。对于一个360K软盘,其各部分的分布如下图1-2所示: 图 1-2 建有MINIX文件系统的一个360K软盘中文件系统各部分的布局示意图 注释1:硬盘的一个扇区是512B,而文件系统的数据块正好是两个扇区。 注释2:引导块是计算机自动加电启动时可由ROM BIOS自动读入得执行代码和数据。 注释3:逻辑块一般是数据块的2幂次方倍数。MINIX文件系统的逻辑块和数据块同等大小 对于硬盘块设备,通常会划分几个分区,每个分区所存放的不同的文件系统。硬盘的第一个扇区是主引导扇区,其中存放着硬盘引导程序和分区表信息。分区表中得信息指明了硬盘上每个分区的类型、在硬盘中其实位置参数和结束位置参数以及占用的扇区总数。其结构如下图1-3所示。 图1-3 硬盘设备上的分区和文件系统 对于可以建立不同的多个文件系统的硬盘设备来说,minix文件系统引入超级块进行管理硬盘的文件系统结构信息。其结构如下图1-4所示。其中,s_ninodes表示设备上得i节点总数,s_nzones表示设备上的逻辑块为单位的总逻辑块数。s_imap_blocks 和s_zmap_blocks分别表示i节点位图和逻辑块位图所占用的磁盘块数。 s_firstdatazone表示设备上数据区开始处占用的第一个逻辑块块号。s_log_zone_size 是使用2为底的对数表示的每个逻辑块包含的磁盘块数。对于MINIX1.0文件系统该值为0,因此其逻辑块的大小就等于磁盘块大小。s_magic是文件系统魔幻数,用以指明文件系统的类型。对于MINIX1.0文件系统,它的魔幻数是0x137f。

实验11-Linux文件操作(II)

实验11 Linux基本文件操作(II) 实验目的 熟悉与目录和文件操作相关的命令 实验内容与要求 要求 显示当前目录的目录名 改变当前目录 使用ls命令的不同命令选项,来查看文件与目录的属性 创建和删除目录 创建0长度的文件 拷贝、移动、重命名、链接及删除文件 查看文件的内容 内容 一、检查你现在所处的环境 1.登录进入系统:使用pwd命令,确认你现在正处在自己的主目录中。这个目 录就是在你登录时,用户缺省进入的目录。 思考:设置默认主目录的环境变量是PATH 二、查看目录 1.把你的当前目录改变为根目录。 2.确认你的当前目录是根目录,并且使用简单列表命令和长列表命令来列出本 目录中的文件。调用使用-a或-R命令选项的ls命令。每一个命令选项各有什么作用?回到你的用户主目录,并列出所有的文件(包括隐藏文件)3.在你的用户主目录中创建一个名为mydir的新目录。然后调用长列表命令来 查看/home/xxx/mydir目录和/home/xxx目录(只查看目录文件的信息)。注意这里xxx代表的是当前用户名。

4.把目录/home/xxx/mydir变为自己的当前目录。使用touch命令在mydir目录 创建名为myfile1,myfile2的两个文件。 5.使用长列表命令来查看mydir目录中的文件的信息。myfile1与myfile2的文 件大小是多少?再次使用长列表命令,同时列出索引结点(inode)的信息。这两个文件的索引结点号是什么? 6.返回到你的用户主目录,调用ls –R命令来查看你的用户主目录中的目录树 结构。 7.使用rmdir命令删除mydir目录,这个命令工作了吗?请注意rmdir命令不能 删除一个非空的目录。为了删除这个目录,你需要调用命令rm –r。 三、对文件进行操作 1.查看/etc/inittab和/etc/passwd文件的内容。使用命令cat、view、less、more 来分别查看每一个命令的输出方式(提示:/etc/inittab文件包括了系统登录的相关信息,/etc/passwd文件包括了被授权使用该系统的用户的列表)。比较cat、view、less、more这几个命令的异同。 2.拷贝文件/usr/bin/cat到你的用户主目录中。该目录没有cat文件,用find命 令查找 3.拷贝文件/usr/bin/cal到你的用户主目录中。 4.列出你的用户主目录中的文件,你会发现上面两个文件已经被拷贝过来了。 在你的用户主目录中创建一个名为xxxscript的目录 四、对目录进行操作 1.将上面两个文件(cat, cal)移动到xxxscript目录中,并且重新命名为mycat 和mycal; 2.将xxxscript目录变为你的当前目录。列出当前目录中的各个文件名,确认上 述两个文件已经被拷贝过来并已更名。 3.使用mycat命令来显示你的用户主目录中的文件.bash_profile中的内容。返 回到你的用户主目录中。 4.在你的用户主目录中创建另一个子目录goodstuff,拷贝文件/etc/profile到这

C语言基础自学总结之十:文件操作

C语言基础自学总结之十:文件操作 要点: 1.文件操作,就是通过程序,操作文件 2.两个方面:读,写 一.fopen 打开文件 函数原型:FILE *fopen(char *filename, char *type);int fclose(FILE *fp); 头文件:#include 是否是标准函数:是 函数功能:函数fopen:打开一个流,即:打开一个文件。该函数有两个参数,filename是需要打开文件的文件名,type是打 开文件的方式。函数fclose:关闭一个流,即:关闭一个 文件,并释放文件缓冲区。fclose函数与fopen函数是相 对的两个函数。fclose函数的参数是指向文件的指针,应 用该函数用以在程序结束之前关闭文件,并释放文件缓冲 区。这样可以保证文件的数据不流失。 返回值:fopen:FILE类型,如果打开的文件存在,返回指向该文件的指针;如果打开的文件不存在,则在指定的目录下建立该 文件打开,并返回指向该文件的指针。fclose:整型,有错

返回非0,否则返回0。 例子1: #include int main(void) { FILE *FP=fopen("文件","打开方式");//返回值是file是一个 结构体,是一个结构体 的宏。 fclose(FP);//打开之后,用完了,就要关闭文件,fclose是跟 fopen一起使用的一个函数。 return 0; } 二. frend 读取 fread:从流中读取字符串函数 函数原型:int fread(void *buf, int size, int count, FILE *fp);头文件:#include 是否是标准函数:是 函数功能:从fp指向的文件中读取长度为size 的count个数据项,并将它输入到以buf为首地址的缓冲区中。此时,文件指针 fp会自动增加实际读入数据的字节数,即fp指向最后读入 字符的下一个字符位置。

linux总结

1软件通常分为系统软件、应用软件、支撑软件 2 操作系统是用户与计算机硬件之间的界面,它是控制、管理计算机系统内各种硬件和软件资源,有效的组织多道程序运行的系统软件。 3 Linux系统吧计算机系统中的硬件资源和软件资源有机地结合在一起,从而提供丰富的功能,包括:控制硬件、管理资源、提供用户接口,处理输入/输出、监视系统、通信。 4 Linux的优点:1与UNIX系统兼容 2自由软件和源码公开 3 性能高和安全性强 4 便于制定和再开发 5 互操作性高 5 Linux 有俩种版本:核心(Kernel)版本和发行(Distribution)版本 6 Linux核心版本根据约定,若版本号为奇数,则表示该版本加入新内容,但不一定稳定,为测试版本。若版本号为偶数,则表示这是一个可以使用的稳定版本 7 安装红旗Linux需要俩个必备的分区,即一个根文件系统分区(类型为ext3,ext2或reiserfs)和一个交换分区(类型为swap) 8 Linux操作系统支持以下文件类型:普通文件、目录文件、设备文件和符号链接文件。 9 设备文件除了在文件I节点中存放属性信息外,他们不包含任何属性信息外,它不包含任何数据,系统利用它们来标记各个设备驱动器 10 符号链接文件时一种特殊文件,提供对其他文件的参照 11 cp命令将源文件或目录复制到目标文件或目录中 12 rm命令删除文件或目录 13 mv命令对文件或目录重新命令,或者将文件从一个目录移到另一个目录中。 14 wc命令统计指定文件的字节数、字数、行数,并将统计结果显示出来 15 绝对路径名和相对路径名的联系与区别 联系:当为命令指定文件路径名是,要指定俩种路径中一种 区别:绝对路径名总是以斜线字符(/)开头 相对路径不能以斜线字符开头 16 硬链接:建立硬链接时,在别的目录或本目录中增加目标文件的一个目录项,这样的一个文件就登记在多个目录中 17 符号链接(软链接)是将一个路径名链接到一个文件,这些文件是一种特别类型的文件 18 软硬链接的区别:1软链接建立了一个新文件而硬链接没有建立新文件 2 软链接没有硬链接的限制,可以对目录文件建立软链接,也可以在不同文件系统之间建立软链接 19 chgrp命令改变文件或目录所属的用户组 20 chown命令改变某个文件或目录的所有者和所属的组 21 ps命令查看当前系统中运行的进程信息 22 kill命令用来终止一个进程的运行 23 vi编辑器三中工作方式:命令方式、插入方式、ex转义方式 24 退出vi的命令 :wq :ZZ :x :q! 四种 25 执行shell脚本的方式: 1 输入定向到shell脚本 2 以脚本名作为bash 参数 3 将shell脚本的权限设置为可执行 26 名称补全的方法是输入目录或文件名的开头部分,然后按Tab键 27 通配符用于模式匹配(四种 * ? [字符组] !) 27 由双引号括起来的字符除($ ‘ \)均作为普通字符对待

Linux操作题整理

五、实验题(共5题,每题2分,共10分) 写出下列操作命令: 1、查看/etc/boot路径下的所有内容。 Ls –al /etc/boot/* 2、查看文件/etc/hosts的内容。 Cat /etc/hosts 3、增加一个组账号group1,并指定组账号ID分别为10100。Groupadd –g 10100 group1 4、增加一个用户账号user1(UID为2045,并属于组group1)。Useradd –u 2045 –g group1 user1 5、搜索路径/etc下所有以h开头的文件及目录,拷贝到/software 中。 Cp –r /etc/h* /software 1.按顺序写出下面操作步骤中所用到的命令。

1) 创建新目录my目录 2) 进入my目录 3) 把一个文本文件复制到my目录下同时命名为,该文本文件绝对路径为/user/book/ 4) 把/user/book/移动到my目录下,文件名不变 5) 删除目录my,没有任何提示 答: 1) $mkdir my 2) $cd my 3) $cp /user/book/ 4) $mv /user/book/ 5) $rm -rf my 下安装软件方式有两种:一是安装rpm格式的智能软件包,二是下载源码编译安装,要求安装以下两个软件:和安装,写出所用到的命令 2) 安装,写出解压解包以及标准安装方式所需步骤和命令。

答:(教材82、84、87页) 1) rpm -ivh 参数含义:i表示安装,v表示在安装过程中显示详细的安装信息,h表示显示水平进度条。 2) 源码编译安装方式: ①释放TAR包 使用命令如下:tar zxvf 查看并阅读包内附带的软件安装说明 ③进行编译准备 使用命令如下:./configure ④进行编译 执行make命令 ⑤进行软件安装 执行make install命令 ⑥清楚临时文件 执行make clean命令

VB_Open_文件操作类函数功能详解

VB Open 文件操作类函数功能详解: 1、Open 文件名[For方式] [Access存取类型] [锁定] AS [#]文件号[Len=记录长度] 功能: 为文件的输入输出分配缓冲区,并确定缓冲区所使用的存取方式 说明: (1)打开方式: 指定文件的输入输出方式,可选,默认是Random。可以是以下值: a、Output:指定顺序输出方式,将覆盖原有内容。 b、Input:指定顺序输入方式。 c、Append:指定顺序输出方式,在文件未尾追加内容。 d、Random:指定随机存取方式,也是默认方式,在Random方式时,如果没有Access子句,则在执行Open语句时,VB将按下列顺序打开文件:读/写、只读、只写。 e、Binary:指定二进制文件。在这种方式下,可以用Get和Put语句对文件中任何字节位置的信息进行读写。在Binary方式中,如果没有Access子句,则打开文件的类型与Random方式相同。 (2)存取类型: 放在关键字Access之后,用来指定访问文件的类型。可以是下列类型之一: a、Read:打开只读文件。 b、Write:打开只写文件。 c、Read Write:打开读写文件。这种类型只对随机文件、二进制文件及用Appe nd方式打开的文件有效。 (3)锁定类型: 该子句只在多用户或多进和环境中使用,用来限制其他用户或其他进程对打开进行读写操作。锁定类型包括: a、默认:如不指定锁定类型,则本进程可以多次打开文件进行读写;在文件打开期间,其他进程不能对该文件执行读写操作。 b、Lock Shared:任何机器上的任何进程都可以对该文件进行读写操作。 c、Lock Read:不允许其他进程读该文件。只在没有其他Read存取类型的进程访问该文件时,才允许这种锁定。 d、Lock Write:不允许其他进程写这个文件。只在没有其他Write存取类型的进程访问该文件时,才允许这种锁定。 e、Lock Read Write:不允许其他进程读写这个文件。 如果不使用lock子句,则默认为Lock Read write。 (4)文件号: 由用户自行指定一个由1~511之间的整数,只要该文件号未被使用就合法;打开文件后,可以用该文件号进行读写等操作。

Linux常用文件和目录类命令

常用文件和目录类命令练习linux (1)启动计算机,利用root用户登录到系统,进入字符提示界面。 (2)用pwd命令查看当前所在的目录。 (3)用ls命令列出此目录下的文件和目录。 (4)用-a选项列出此目录下包括隐藏文件在内的所有文件和目录。 (5)用man命令查看ls命令的使用手册。 (6)在当前目录下,创建测试目录test。 (7)利用ls命令列出文件和目录,确认test目录创建成功。 (8)进入test目录,利用pwd查看当前工作目录。 (9)利用touch命令在当前目录创建一个新的空文件newfile。 (10)利用cp命令复制系统文件/etc/profile到当前目录下。 (11)复制文本profile到一个新文件profile.bak,作为备份。 (12)用ll命令以长格式的形式列出当前目录下的所有文件,注意比较每个文件的 长度和创建时间的不同。 (13)用less命令分屏查看profile文件的内容,注意联系less命令的各个子命令, 例如b、p、q等并对“then”关键字查找。 (14)用grep命令在profile文件中对关键字“then”进行查询,并于上面的结果比 较。 (15)给文件profile创建一个软链接lnsprofile和一个硬链接lnhprofile。 (16)长格式显示文件profile、lnsprofile、lnhprofile的详细信息。注意比较3个文 件链接数的不同。 (17)删除文件profile,用长格式显示lnsprofile和lnhprofile的详细信息,比较文 件lnhprofile的链接数的变化。 (18)用less命令查看文件lnsprofile的内容,看看有什么结果。 (19)用less命令查看文件lnhprofile的内容,看看有什么结果。 (20)删除文件lnsprofile,显示当前目录下的文件列表,回到上层目录。 (21)用tar命令把目录打包。 (22)用gzip命令把打好的包进行压缩。 (23)把文件test.tar.gz改名为backup.tar.gz。 (24)显示当前目录下的文件和目录列表,确认重命名成功。 (25)把文件backup.tar.gz移动到test目录下。 (26)显示当前目录下的文件和目录列表,确认移动成功。 (27)进入test目录,显示目录中的文件列表。 (28)把文件test.tar.gz解包。 (29)显示当前目录下的文件和目录列表,复制test目录为testbak目录作为备份。 (30)查找root用户自己的主目录下所有名为newfile的文件。 (31)删除test子目录下的所有文件。 (32)利用rmdir命令删除空子目录test。 (33)回到上层目录,利用rm命令删除目录test和其下所有文件。

Linux系统编程-文件操作

最基本的访问文件方法是:使用read()和write()系统调用。在一个文件能被访问之前,必须通过open() 或者creat()系统调用打开它,一旦使用完毕,则用close()系统调用来关闭文件。 1.open #include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 返回值:成功返回新分配的文件描述符,出错返回-1并设置errno eg: int fd; fd = open("/home/kidd/aaa",O_RDONLY); if(fd == -1) /*error*/ pathname 参数是要打开或创建的文件名,和fopen一样,pathname 既可以是相对路径也可以是绝对路径。 flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来, 所以这些常数的宏定义都以O_开头,表示or 。 以下三个三先一: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 以下可多选(以或的形式)(进行按位或运算,用以修改打开文件请求的行为) O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。 (文件将以追加模式下打开。就是说,在每次写操作之前,文件位置指针将被置于文件末尾,即使 在进程刚刚完成写操作并改变文件位置指针之后,如有另一进程开始写操作,情形也是如此。)O_CREAT 若此文件不存在则由(内核来)创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。 有0666。如果文件已存在,本标志无效,除非给出了O_EXCL标志。 当文件创建时,mode参数提供新建文件的权限。系统并不在该次打开文件时检查权限,所以你可以进行相反的操作,例如设置文件为只读权限,但却在打开文件后进行写操作。最终写入磁盘的权限位还需让mode参数与用户文件创建的掩码(即umask)做按位与操作后来确定。 umask 022,mode 0666,文件权限为0644(0666&~022) O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。(用来防止文件创建时出现单键竞争。)O_TRUNC 如果文件已存在且为普通文件,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。 对于FIFO或者终端设备,该参数被忽略。在其他文件类型上则没有定义。因为截断文件需要写权限,所以O_TRUNC和O_RDONLY同时使用也是没有定义的。 eg: int fd; fd = open("/home/teach/pearl", O_WRONLY|O_TRUNC); if(fd == -1) /*error*/ O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O (Nonblock I/O )。

相关文档
最新文档