Linux下应用开发基础知识大总结
liebian365 2024-11-21 17:35 19 浏览 0 评论
应用程序开发方式
在Linux下开发应用程序可以调用两种接口来实现,一种是直接调用系统调用接口,另一种是调用库函数来实现。
1、什么是系统调用?
系统调用(System Call)是操作系统提供的服务,是应用程序与内核通信的接口。Linux提供的系统调用包含的内容有:文件操作、进程控制、系统控制、内存管理、网络管理、socket套接字、进程间通信、用户管理等。
相对于普通的函数调用来说, 系统调用的性能消耗也是巨大的。 所以在追求极致性能的程序中, 都在尽力避免系统调用。
2、C库函数
C标准库头文件如下:
Linux环境下, 使用的C库一般都是glibc, 它封装了几乎所有的系统调用, 代码中使用的“系统调用”, 实际上就是调用C库中的函数。 因为C库函数通过系统调用来实现,库函数对上层提供了C库接口。比如文件操作:
实例:文件操作
Linux下文件操作应用程序结构如下:
Linux下,“一切皆文件”。为了使不同的文件系统共存, Linux 内核在用户层与具体文件系统之前增加了虚拟文件系统(VFS)中间层,它对复杂的系统进行抽象化,对用户提供了统一的文件操作接口。
1、文件操作:系统调用
(1)实操
代码:
/* 文件操作:系统调用 */
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fd; /* 文件描述符 */
char rd_buf[50] = {0}; /* 读数据buf */
/* 以读写的方式打开文件demo0_test,若文件不存在则创建文件 */
fd = open("demo0_test", O_RDWR|O_CREAT|O_TRUNC, S_IRWXU);
if (NULL == fd)
{
printf("Open file error!\n");
return 0;
}
/* 往文件中写数据 */
write(fd, "helllo world\n", strlen("helllo world\n"));
/* 移动文件指针至文件开头 */
lseek(fd, 0, SEEK_SET);
/* 读出文件数据并打印 */
read(fd, rd_buf, 50);
printf("Read data: %s\n", rd_buf);
/* 关闭文件 */
close(fd);
return 0;
}
运行结果:
(2)接口说明
open函数:
? pathname:要打开或创建的文件名;
? flag:指定文件的打开方式,具体有以下参数,见下表 flag 参数值。
? mode:当 open 函数的 flag 值设置为 O_CREAT 时,必须使用 mode 参数来设置文件与用户相关的 权限。 mode 可用的权限如下表所示,表中各个参数可使用” | “来组合。
read函数:
? fd:文件对应的文件描述符 ;
? buf:指向数据缓冲区的指针;
? count:读取多少个字节的数据。
write函数:
? fd:文件对应的文件描述符;
? buf:指向数据缓冲区的指针;
? count:往文件中写入多少个字节。
close函数:
关闭 fd 文件描述符对应的文件。
lseek 函数:
lseek 函数可以用与设置文件指针的位置,并返回文件指针相对于文件头的位置。 其中的 offset 参数用于指定位置, whence 参数则定义了 offset 的意义, whence 的可取值如下:
? SEEK_SET: offset 是一个绝对位置。
? SEEK_END: offset 是以文件尾为参考点的相对位置。
? SEEK_CUR: offset 是以当前位置为参考点的相对位置。
2、文件操作:C库函数
(1)实操
代码:
/* 文件操作:c库函数 */
#include <stdio.h>
#include <stdlib.h>
?
int main(void)
{
FILE *fp; /* 文件描述符 */
char rd_buf[50] = {0}; /* 读数据buf */
/* 以读写的方式打开文件demo1_test,若文件不存在则创建文件 */
fp = fopen("demo1_test", "w+");
if (NULL == fp)
{
printf("Open file error!\n");
return 0;
}
/* 往文件中写数据 */
fwrite("hello world\n", 1, strlen("helllo world\n"), fp);
/* 同步缓冲区:把缓冲区数据立即写入文件 */
fflush(fp);
/* 移动文件指针至文件开头 */
fseek(fp, 0, SEEK_SET);
/* 读出文件数据并打印 */
fread(rd_buf, 50, 1, fp);
printf("Read data: %s\n", rd_buf);
/* 关闭文件 */
fclose(fp);
return 0;
}
运行结果:
(2)接口说明
fopen函数:
? pathname 参数用于指定要打开或创建的文件名。
? mode 参数用于指定文件的打开方式,注意该参数是一个字符串,输入时需要带双引号:
?“r”:以只读方式打开,文件指针位于文件的开头。
?“r+”:以读和写的方式打开,文件指针位于文件的开头。
?“w”:以写的方式打开,不管原文件是否有内容都把原内容清空掉,文件指针位于文件的开头。
?“w+”:同上,不过当文件不存在时,前面的” w”模式会返回错误,而此处的” w+”则会创建新文件。
?“a”:以追加内容的方式打开,若文件不存在会创建新文件,文件指针位于文件的末尾。与” w+”的区 别是它不会清空原文件的内容而是追加。
?“a+”:以读和追加的方式打开,其它同上。
? fopen 的返回值是 FILE 类型的文件文件流,当它的值不为 NULL 时表示正常,后续的 fread、 fwrite 等函数可通过文件流访问对应的文件。
fopen 的 mode 与 open 的 flags 参数关系:
fread 函数:
stream 是使用 fopen 打开的文件流, fread 通过它指定要访问的文件,它从该文件中读取 nmemb 项数据,每 项的大小为 size,读取到的数据会被存储在 ptr 指向的数组中。 fread 的返回值为成功读取的项数(项的单位 为 size)。
fwrite 函数:
它的操作与 fread 相反,把 ptr 数组中的内容写入到 stream 文件流,写入的项数为 nmemb,每项大小为size,返回值为成功写入的项数(项的单位为 size)。
fclose 函数:
fclose 库函数用于关闭指定的文件流,关闭时它会把尚未写到文件的内容都写出。因为标准库会对数据进行缓冲,所以需要使用 fclose 来确保数据被写出。
fflush 函数:
fflush 函数用于把尚未写到文件的内容立即写出。常用于确保前面操作的数据被写入到磁盘上。 fclose 函数本 身也包含了 fflush 的操作。
fseek 函数:
其中的 offset 参数用于指定位置, whence 参数则定义了 offset 的意义, whence 的可取值如下:
? SEEK_SET: offset 是一个绝对位置。
? SEEK_END: offset 是以文件尾为参考点的相对位置。
? SEEK_CUR: offset 是以当前位置为参考点的相对位置。
以上就是本次的分享,如有错误,欢迎指出!
相关参考书籍:
《Linux环境编程:从应用到内核》
《野火Linux开发实战指南》
《嵌入式Linux上的C语言编程实践》
相关推荐
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
-
大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
-
这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...
- codeblocks和VS2019下的fltk使用中文
-
在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
-
FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
-
IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
-
预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...
- Ubuntu系统下COM口测试教程(ubuntu port)
-
1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
-
很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...
- 新阁上位机开发---10年工程师的Modbus总结
-
前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...
- 创建你的第一个可运行的嵌入式Linux系统-5
-
@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...
- 如何在Linux下给zigbee CC2530实现上位机
-
0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...
- Python实现串口助手 - 03串口功能实现
-
串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...
- 为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口
-
UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...
- 同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理
-
串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...
- 嵌入式linux为什么可以通过PC上的串口去执行命令?
-
1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
- codeblocks和VS2019下的fltk使用中文
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
- Ubuntu系统下COM口测试教程(ubuntu port)
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
- 新阁上位机开发---10年工程师的Modbus总结
- 创建你的第一个可运行的嵌入式Linux系统-5
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)