文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。
相关链接:
linux C 语言开发 (一) Window下用gcc编译和gdb调试
linux C 语言开发 (二) VsCode远程开发 linux
linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)
Linux C到Android App开发推荐链接(入门十二章):
开源 java android app 开发(一)开发环境的搭建_csdn 开源 java android app-CSDN博客
开源 java android app 开发(一)开发环境的搭建-CSDN博客
开源 java android app 开发(二)工程文件结构-CSDN博客
开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客
开源 java android app 开发(四)GUI界面重要组件-CSDN博客
开源 java android app 开发(五)文件和数据库存储-CSDN博客
开源 java android app 开发(六)多媒体使用-CSDN博客
开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客
开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客
开源 java android app 开发(九)后台之线程和服务-CSDN博客
开源 java android app 开发(十)广播机制-CSDN博客
开源 java android app 开发(十一)调试、发布-CSDN博客
开源 java android app 开发(十二)封库.aar-CSDN博客
linux C到.net mvc开发推荐链接:
开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客
开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客
开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客
开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客
开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客
主要内容:讲述linux中的文件IO和标准IO的区别
目录:
1.基本介绍
2.函数介绍
3.综合代码
4.效果演示
一、基本介绍
文件 IO 是 Linux 系统提供的接口, 针对文件和磁盘进行操作, 不带缓存机制; 标准 IO 是 C 语言函数库里的标准 I/O 模型, 在 stdio.h 中定义, 通过缓冲区操作文件, 带缓存机制。 Linux 系统中一切皆文件, 包括普通文件, 目录, 设备文件(不包含网络设备) , 管道, fifio 队列, socket 套接字等, 在终端输入“ls -l”可查看文件类型和权限。
标准 IO 和文件 IO 常用 API 如下:
标准 IO | 文件 IO | |
打开/创建 | fopen | open |
读 | getc,fgetc,getchar,fgets,gets, fread | read |
写 | putc,fputc,putc,fputs,puts, fwrite | write |
关闭 | fclose | close |
区别图展示
文件 IO 是直接调用内核提供的系统调用函数(linux), 头文件是 unistd.h, 标准 IO 是间接调用系统调用函数(系统都可以),头文件是 stdio.h,
二、函数介绍
open
函数 | int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t mode) |
头文件 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> |
参数 pathname | 路径和文件名 |
参数 flags | 文件打开方式, 可用多个标志位按位或设置 |
参数 mode | 权限掩码, 对不同用户和组设置可执行, 读, 写权限, 使用八进制数表示, 此参数可不写 |
返回值 | open()执行成功会返回 int 型文件描述符, 出错时返回-1。 |
作用 | 通过系统调用, 可以打开文件, 并返回文件描述符 |
read
函数 | ssize_t read(int fd, void *buf, size_t count) |
头文件 | #include <unistd.h> |
参数 fd | 要读的文件描述符 |
参数 buf | 缓冲区, 存放读到的内容 |
参数 count | 每次读取的字节数 |
返回值 | 返回值大于 0, 表示读取到的字节数;等于 0 在阻塞模式下表示到达文件末尾或没有数据可读(EOF) , 并调用阻塞;等于-1 表示出错, 在非阻塞模式下表示没有数据可读。 |
write
函数 | ssize_t write(int fd, const void *buf, size_t count); |
头文件 | #include <unistd.h> |
参数 fd | 文件描述符; |
参数 buf | 缓存区, 存放将要写入的数据 |
参数 count | 每次写入的个数 |
功能 | 每次从 buf 缓存区拿 count 个字节写入 fd 文件。 |
返回值 | 大于或等于 0 表示执行成功, 返回写入的字节数;返回-1 代表出错 |
close
函数 | int close(int fd) |
头文件 | #include <unistd.h> |
参数 fd | 文件描述符 |
返回值 | 成功返回 0; 错误返回-1 |
三、综合代码
功能:打开文件1和文件2,如果文件1不为空,将文件1的前32个字符写入文件2,最后关闭。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
//步骤一: 判断命令行的参数
if(argc != 3)
{
printf("Usage:%s <src file> <obj file>\n", argv[0]);
}
// 步骤二: 定义变量
int fd_src;
int fd_obj;
char buf[32] = {0};
ssize_t ret;
// 步骤三: 打开文件获得文件描述符
fd_src = open(argv[1], O_RDWR);
if (fd_src < 0)
{
printf("open is error\n");
return -1;
}
fd_obj = open(argv[2], O_CREAT | O_RDWR, 0666);
if (fd_obj < 0)
{
printf("open is error\n");
return -2;
}
// 步骤四: 读写操作
while((ret=read(fd_src,buf,32))!=0)
{
write(fd_obj,buf,ret);
}
// 步骤五: 关闭文件描述符
close(fd_src);
close(fd_obj);
return 0;
}
四、实际效果
编译文件
运行main,1.txt的内容拷贝到2.txt。