导图社区 LinuxIO
这是一篇关于day2的思维导图,主要内容包括:目录操作函数,标准文件IO和Linux文件IO的区别,linuxIO没有缓存区。
编辑于2024-11-28 17:58:10这是一篇关于day5day6的思维导图,主要内容包括:消息队列:信息是带有类型的 可以过滤,IPC通信:共享内存 消息队列 信号灯集、ipcs命令 查看共享内存 消息队列 信号量、ipcs -s 查看信号量、ipcs -m 查看共享内存、ipcs -q 查看消息队列,共享内存,管道:在内核开辟的一块缓冲区,信号,进程间通信的方式。
这是一篇关于day4的思维导图,主要内容包括:设置线程属性,线程的同步,线程的互斥,线程。线程概念:为进一步减少处理器的空转时间,支持多处理器以及减少上下文切换开销,进程演化出线程,它是进程内独立的一条运行路线,是内核调度的最小单元。
这是一篇关于day3的思维导图,主要内容包括:守护进程,回收进程资源,孤儿进程和僵尸进程,exec族函数,结束进程,进程,Linux下的多任务机制。
社区模板帮助中心,点此进入>>
这是一篇关于day5day6的思维导图,主要内容包括:消息队列:信息是带有类型的 可以过滤,IPC通信:共享内存 消息队列 信号灯集、ipcs命令 查看共享内存 消息队列 信号量、ipcs -s 查看信号量、ipcs -m 查看共享内存、ipcs -q 查看消息队列,共享内存,管道:在内核开辟的一块缓冲区,信号,进程间通信的方式。
这是一篇关于day4的思维导图,主要内容包括:设置线程属性,线程的同步,线程的互斥,线程。线程概念:为进一步减少处理器的空转时间,支持多处理器以及减少上下文切换开销,进程演化出线程,它是进程内独立的一条运行路线,是内核调度的最小单元。
这是一篇关于day3的思维导图,主要内容包括:守护进程,回收进程资源,孤儿进程和僵尸进程,exec族函数,结束进程,进程,Linux下的多任务机制。
day2
linuxIO 没有缓存区
1、open函数
1、open的返回值是int 文件描述符 失败-1 2、打开文件的方式 //打开文件的方式如下 O_RDONLY //以只读的方式打开 RD read ONLY O_WRONLY //以只写的方式打开 WR write ONLY O_RDWR //以可读可写的方式打开 O_TRUNC //清空原文件中的内容 O_APPEND //追加文件尾巴 O_CREAT //创建文件 mode_t mode //文件权限 如果当第二个参数flag有O_CREAT,可以加上第三个参数代表文件权限 0666
功能:打开文件
参数说明
头文件及函数原型 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); int fd = open("hello.c",O_WRONLY);//以只写的方式打开 int fd = open("hello.c",O_WRONLY | O_TRUNC | O_CREAT, 0666);//以只写的方式打开hello.c, //如果hello.c存在清空并打开, 如果不存在创建并打开 (3)参数说明: const char *pathname //打开文件的文件名(可以相对路径也可以是绝对路径) int flags //打开文件的方式 //打开文件的方式如下 O_RDONLY //以只读的方式打开 RD read ONLY O_WRONLY //以只写的方式打开 WR write ONLY O_RDWR //以可读可写的方式打开 O_TRUNC //清空原文件中的内容 O_APPEND //追加文件尾巴 O_CREAT //创建文件 mode_t mode //文件权限 如果当第二个参数flag有O_CREAT,可以加上第三个参数代表文件权限 0666 //调用参考 int fd = open("hello.c",O_WRONLY);//以只写的方式打开 int fd = open("hell.c",O_WRONLY | O_TRUNC | O_CREAT, 0666);//以只写的方式打开hello.c,如果hello.c存在内容,清空并打开,不存在,创建并打开 int fd = open("hello.c",O_RDONLY | O_CREAT,0666); //如果文件不存在,创建并打开
返回值: 成功:int fd 失败:-1
int fd//非负文件描述符 ,每打开一个文件,内核 就会自动给应用进程返回一个文件描述符,做为该打开文件的标识
2、close
功能:关闭文件
参数说明
头文件及函数原型 #include <unistd.h> int close(int fd); //调用参考 close(fd); (3) 参数说明 int fd;//open函数返回值,被关闭的文件描述符
返回值: 成功: 0 失败:-1
3、read
功能:从文件中读取数据(按字节) 一次读取多少个字节//一次读取一大片
参数说明
头文件及函数原型 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); (3) 参数说明: int fd //文件描述符,open的返回值 void *buf //文件中读取出数据的存储位置 size_t count //最大读取的字节数 //调用 char buf[100] = { 0 }; //用来存储读取的数据 read(fd,buf,sizeof(buf));
返回值: 成功:实际读取到的字节数 fread返回值:成功实际读取到的块数、对象数、记录数 read返回值:成功实际读取到的字节数 失败:-1
4、write
功能:写入数据(按字节)
参数说明
头文件及函数原型 #include <unistd.h> ssize_t write(int fd, const void *buf, size_t count); (3) 参数说明: int fd //文件描述符,open的返回值 const void *buf //指向将要写入文件中数据的存储位置 size_t count //实际 你想要 写入的字节数 //调用参考 char buf[100] = "hello"; //用来存储读取的数据 write(fd,buf,strlen(buf)); //strlen(buf)代表实际写入的字节数 sizeof(buf) == 100
返回值: 成功:实际写入的字节数 失败:-1
练习1
请写出标准main函数的格式, 用命令行传参./a.out a.c b.c,利用read和write实现内容拷贝,将a.c的内容,拷贝到b.c文件中 #include"my.h" int main(int argc, const char *argv[]) { if(argc != 3) { printf("忘记传递参数!\n"); return -1; } int fpd = open(argv[1],O_RDONLY);//以只读形式打开拷贝的文件 int fwd = open(argv[2],O_WRONLY | O_TRUNC | O_CREAT,0666);//以只写形式打开拷贝到的文件 存在清空 不存在创建 if(fpd == -1 || fwd == -1) { perror("open failed"); return -1; } //循环读取 读取到多少个字节 就写入多少个字节 int ret; char buf[50]; while((ret = read(fpd,buf,sizeof(buf))) > 0) { write(fwd,buf,ret);//ret是实际读取到多少字节 就实际写入多少个字节 } close(fpd); close(fwd); return 0; }
5、lseek
功能:移动文件指针,同时能够获取移动之后文件指针的位置 //兼具了fseek和ftell两个函数的功能
参数说明
头文件及函数原型 typedef long off_t; #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); (3)参数说明: int fd //open的返回值 off_t offset //偏移量 int whence //基准值,相对位置 //偏移量:正数--->向后移动 负数---->向前移动 lseek(fd,100,SEEK_SET); //相对文件起始位置向后移动100个字符 lseek(fd,-100,SEEK_END); //相对于文件尾位置向前移动100个字符 lseek(fd,100,SEEK_CUR); //相对于当前文件指针的位置向后移动100个字符 lseek(fd,-100,SEEK_CUR); //相对于当前文件指针的位置向前移动100个字符 lseek(fd, 0, SEEK_SET); //将文件指针移动到文件的头 lseek(fd, 0, SEEK_END);// 将文件指针移动到文件的尾巴
返回值: 成功:返回移动完文件指针之后,当前文件指针的位置 失败:-1
6、三个文件描述符
LinuxIO操作的核心对象 是文件描述符 一个程序的执行 有三个自动打开的文件描述符
标准输入 0 默认从键盘输入
标准输出 1 默认从终端输出
标准错误输出 2 默认从终端输出
标准文件IO和Linux文件IO的区别
1、标准IO属于C库函数,LinuxIO属于系统调用 2、标准IO存在缓冲区 而LinuxIO不存在缓存区 3、标准IO用文件流指针(FILE*)作为打开文件的标识 而LinuxIO用文件描述符(int)作为打开的文件的标识
目录操作函数
1、stat函数
功能:获取文件属性的
参数说明
头文件及函数原型 #include <unistd.h> int stat(const char *path, struct stat *buf); (3)参数说明: const char *path //将要获取属性的文件名, 可以加上路径修饰 struct stat *buf //用来保存这个文件属性信息的一个结构体 //调用参考 struct stat s = { 0 }; //所有的成员变量都是0 stat("hello.c",&s);//参数上的地址传递 //函数调用结束之后 s变量里面,存储的就是 hello.c的文件属性 stat("/home/linux",&s);//获取目录文件 linux这个文件夹的属性
返回值: 成功:0 失败:-1
调用参考
struct stat { mode_t st_mode; //文件对应的模式,文件,目录等 ino_t st_ino; //inode节点号 dev_t st_dev; //设备号码 dev_t st_rdev; //特殊设备号码 nlink_t st_nlink; //文件的连接数 uid_t st_uid; //文件所有者 gid_t st_gid; //文件所有者对应的组 off_t st_size; //普通文件,对应的文件字节数 time_t st_atime; //文件最后被访问的时间 time_t st_mtime; //文件内容最后被修改的时间 time_t st_ctime; //文件状态改变时间 blksize_t st_blksize; //文件内容对应的块大小 blkcnt_t st_blocks; //文件内容对应的块数量 };
2、opendir
功能:打开目录文件 directory
参数说明
头文件及函数原型 #include <dirent.h> DIR *opendir(const char *name); (3)参数说明: const char *name //目录文件名(可以相对路径也可以是绝对路径) //调用参考 DIR* dp = opendir("/home/linux/24101IO");
返回值: 成功:DIR* //成功,返回非空的打开目录文件的标识 失败:NULL
3、readdir
功能:读取目录文件,每一个读取出一个文件
参数说明
头文件及函数原型 #include <dirent.h> struct dirent *readdir(DIR *dirp); (3) 参数说明: DIR *dirp //opendir的返回值 //调用参考 struct dirent* ep = readdir(dp); printf("%s\n",ep->d_name);
调用参考
struct dirent { long d_ino; /* inode number 索引节点号 */ off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ unsigned short d_reclen; /* length of this d_name 文件名长 */ unsigned char d_type; /* the type of d_name 文件类型 */ char d_name[NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */ }
返回值: 成功:struct dirent * 失败:NULL
4、closedir
功能:关闭目录文件
参数说明
头文件及函数原型 #include <dirent.h> int closedir(DIR *dirp); //调用 closedir(dp); (3)参数说明: DIR *dirp //opendir的返回值
返回值: 成功:0 失败:-1