嵌入式Linux应用编程基本概念

Linux应用编程涉及到在Linux环境下开发和运行应用程序的一系列概念。以下是一些涵盖Linux应用编程的基本概念:

1. 系统调用

系统调用是用户空间程序与内核之间进行通信的方式。它提供了一组接口,允许应用程序请求内核执行特权操作。在Linux中,系统调用的例子包括fork(创建新进程)、read(读取文件)、write(写入文件)等。开发者通常通过系统调用接口来访问操作系统提供的功能。

#include <unistd.h>int main() {char buffer[256];read(STDIN_FILENO, buffer, sizeof(buffer));write(STDOUT_FILENO, buffer, sizeof(buffer));return 0;
}

2. 进程

在Linux中,进程是正在运行的程序的实例。每个进程都有独立的内存空间、文件描述符和执行上下文。fork系统调用用于创建新进程。exec系列系统调用用于在进程中执行新程序。

#include <unistd.h>
#include <sys/wait.h>int main() {pid_t child_pid = fork();if (child_pid == 0) {// 子进程执行的代码execl("/bin/ls", "ls", NULL);} else {// 等待子进程结束waitpid(child_pid, NULL, 0);}return 0;
}

3. 文件描述符

文件描述符是一个整数,用于标识一个打开的文件、套接字或其他I/O资源。标准输入、标准输出和标准错误的文件描述符分别是0、1和2。文件描述符的操作包括读、写、关闭等。

#include <unistd.h>
#include <fcntl.h>int main() {int fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);write(fd, "Hello, Linux!", 13);close(fd);return 0;
}

4. 线程

Linux支持多线程编程。线程是一个轻量级的执行单元,可以与同一进程的其他线程共享内存空间。线程可以通过pthread库创建和管理。

#include <pthread.h>
#include <iostream>void* threadFunction(void* arg) {std::cout << "Hello from thread!" << std::endl;return NULL;
}int main() {pthread_t thread;pthread_create(&thread, NULL, threadFunction, NULL);pthread_join(thread, NULL);return 0;
}

5. 进程间通信(IPC)

进程间通信是指不同进程之间进行数据交换的机制。Linux提供多种IPC机制,包括管道、消息队列、共享内存和信号等。这些机制允许进程之间进行数据共享和通信。

6. 信号

信号是一种在软件层次上处理异步事件的机制。它允许进程在运行时接收通知,例如用户按下Ctrl+C终止进程。signal函数和kill命令用于处理和发送信号。

#include <csignal>
#include <iostream>void signalHandler(int signum) {std::cout << "Received signal: " << signum << std::endl;
}int main() {signal(SIGINT, signalHandler);  // 注册信号处理函数while (1) {// 程序执行主循环}return 0;
}

7. 动态链接库

Linux支持动态链接库(共享库)的概念,允许程序在运行时动态加载和卸载共享库。这有助于减小可执行文件的大小,共享代码,提高代码的可重用性。

#include <dlfcn.h>
#include <iostream>int main() {void* handle = dlopen("libexample.so", RTLD_NOW);if (handle) {typedef void (*ExampleFunction)();ExampleFunction function = (ExampleFunction)dlsym(handle, "exampleFunction");if (function) {function();}dlclose(handle);}return 0;
}

8. 文件系统操作

Linux应用编程涉及对文件系统的各种操作,例如创建、读取、写入、删除文件,以及目录操作。系统调用和标准C库提供了相关的函数,例如openreadwriteunlink等。

这些概念构成了Linux应用程序开发的基础,开发者可以通过这些机制实现复杂的应用程序和系统工具。掌握这些概念对于在Linux环境下进行应用编程至关重要。

9. Socket 编程

Socket 编程是 Linux 应用程序中常用的一种网络编程方式。通过使用套接字(Socket),可以实现进程间的通信和网络通信。常见的 Socket 编程包括创建套接字、绑定地址、监听连接、接受连接、发送和接收数据等操作。

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>int main() {// 创建套接字int serverSocket = socket(AF_INET, SOCK_STREAM, 0);// 绑定地址sockaddr_in serverAddress;serverAddress.sin_family = AF_INET;serverAddress.sin_port = htons(8080);serverAddress.sin_addr.s_addr = INADDR_ANY;bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress));// 监听连接listen(serverSocket, 5);// 接受连接int clientSocket = accept(serverSocket, NULL, NULL);// 发送和接收数据char buffer[256];read(clientSocket, buffer, sizeof(buffer));std::cout << "Received: " << buffer << std::endl;write(clientSocket, "Hello from server!", 18);// 关闭套接字close(clientSocket);close(serverSocket);return 0;
}

10. 多路复用(select 和 epoll)

多路复用是一种提高 I/O 操作效率的机制,它允许一个进程同时监视多个文件描述符。在 Linux 中,select 和 epoll 是常用的多路复用机制。它们可以用于处理多个套接字的并发事件,提高网络应用程序的性能。

// 使用 select 示例
#include <sys/select.h>
#include <iostream>int main() {fd_set readfds;FD_ZERO(&readfds);FD_SET(STDIN_FILENO, &readfds);struct timeval timeout;timeout.tv_sec = 5;timeout.tv_usec = 0;int result = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout);if (result > 0 && FD_ISSET(STDIN_FILENO, &readfds)) {std::cout << "Data is available to read from stdin." << std::endl;} else if (result == 0) {std::cout << "Timeout occurred." << std::endl;} else {std::cerr << "Error in select." << std::endl;}return 0;
}

11. 内存映射(mmap)

内存映射是将文件的一部分直接映射到进程的地址空间,使得文件可以像内存一样被访问。mmap 是 Linux 提供的用于内存映射的系统调用。

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fileDescriptor = open("example.txt", O_RDWR);off_t fileSize = lseek(fileDescriptor, 0, SEEK_END);void* mappedMemory = mmap(NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED, fileDescriptor, 0);close(fileDescriptor);// 对映射的内存进行读写操作char* data = static_cast<char*>(mappedMemory);data[0] = 'H';data[1] = 'i';// 解除内存映射munmap(mappedMemory, fileSize);return 0;
}

12. 定时器

Linux 提供了多种定时器机制,允许应用程序执行定时任务。setitimer 是其中之一,它允许设置定时器来在指定的时间间隔内定期触发信号。

#include <sys/time.h>
#include <csignal>
#include <iostream>void timerHandler(int signum) {std::cout << "Timer expired! Signal number: " << signum << std::endl;
}int main() {struct itimerval timer;timer.it_value.tv_sec = 2;timer.it_value.tv_usec = 0;timer.it_interval.tv_sec = 1;timer.it_interval.tv_usec = 0;signal(SIGALRM, timerHandler);setitimer(ITIMER_REAL, &timer, NULL);while (1) {// 主循环}return 0;
}

这些概念覆盖了 Linux 应用编程的多个方面,包括文件 I/O、网络编程、进程控制、多路复用、内存映射、定时器等。深入了解这些概念将帮助开发者编写高效且功能强大的 Linux 应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479809.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python笔记-设计模式】对象池模式

一、说明 用于管理对象的生命周期&#xff0c;重用已经创建的对象&#xff0c;从而减少资源消耗和创建对象的开销 (一) 解决问题 主要解决频繁创建和销毁对象所带来的性能开销问题。如数据库连接、线程管理、网络连接等&#xff0c;对象的创建和销毁成本相对较高&#xff0c…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现&#xff1a;

发电机项目 2/19

MQTT 一.MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协议…

掌握array_walk()函数:解锁PHP数组操作的神奇力量!

掌握array_walk()函数&#xff1a;解锁PHP数组操作的神奇力量&#xff01; 在 PHP 开发过程中&#xff0c;我们经常需要对数组进行遍历和处理。array_walk() 函数是 PHP 函数库中的一个重要工具&#xff0c;它提供了一种便捷的方式来对数组中的每个元素执行自定义操作。本文将深…

java8的 lambda表达式到stream API总结备忘

文章目录 1. Lambda 表达式为什么使用 Lambda 表达式从匿名类到 Lambda 的转换Lambda 表达式语法语法格式一&#xff1a;无参&#xff0c;无返回值&#xff0c;Lambda 体只需一条语句语法格式二&#xff1a;Lambda 需要一个参数语法格式三&#xff1a;Lambda 只需要一个参数时&…

Windows 使设置更改立即生效——并行发送广播消息

目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_5907…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾&#xff1a; SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾&#xff1a; 【STM32】SP…

opencv安装介绍以及基本图像处理详解

文章目录 一、什么是OpenCV &#xff1f;二. OpenCV 安装1. 下载地址2.安装命令&#xff1a;pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作&#xff08;彩色图片&#xff09;&#xff08;1&#xff09;读取图片&#xff1a;cv2.imread( )&#xff08…

java中实体pojo对于布尔类型属性命名尽量别以is开头,否则 fastjson可能会导致属性读取不到

假如我们有一个场景&#xff0c;就是需要将一个对象以字符串的形式&#xff0c;也就是jsonString存到一个地方&#xff0c;比如mysql&#xff0c;或者redis的String结构。现在有一个实体&#xff0c;我们自己创建的&#xff0c;叫做CusPojo.java 有两个属性是布尔类型的&#x…

获取 Windows 系统托盘图标信息的最新方案(一)

目录 前言 1 获取系统托盘图标的一般方法 1.1 使用 TB_ 类消息的注意事项 1.2 代码编写和测试 1.3 技术的适用范围 2 深度分析系统托盘图标信息 2.1 分析 Shell_NotifyIcon 函数参数 2.2 分析 Shell_NotifyIcon 函数的内部细节 2.3 分析 WM_COPYDATA 消息 2.4 调用方…