linux下io操作詳細解析

在 Linux 系統下,IO(輸入/輸出)操作是程序與外部設備(如文件、網絡等)交互的重要方式。Linux 提供了豐富的系統調用和庫函數來支持各種 IO 操作。以下是對 Linux 下 IO 操作的詳細解析,包括文件 IO、網絡 IO 和緩沖機制等內容。


一、文件 IO 操作

1. 打開文件(open?系統調用)

open 系統調用用于打開一個文件,返回一個文件描述符(file descriptor),后續操作都通過這個文件描述符進行。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("example.txt", O_RDONLY); // 打開文件用于只讀if (fd == -1) {perror("open failed");return 1;}std::cout << "File opened successfully, file descriptor: " << fd << std::endl;close(fd); // 關閉文件return 0;
}
  • O_RDONLY:只讀模式。

  • O_WRONLY:只寫模式。

  • O_RDWR:讀寫模式。

  • O_CREAT:如果文件不存在,則創建文件。

  • O_TRUNC:如果文件已存在,將其長度截斷為 0。

  • O_APPEND:寫入時將數據追加到文件末尾。

2. 讀取文件(read?系統調用)

read 系統調用從文件描述符指定的文件中讀取數據。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open failed");return 1;}char buffer[128];ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);if (bytesRead == -1) {perror("read failed");close(fd);return 1;}buffer[bytesRead] = '\0'; // 確保字符串以 null 結尾std::cout << "Read " << bytesRead << " bytes: " << buffer << std::endl;close(fd);return 0;
}
  • read 返回讀取的字節數,如果返回 0 表示已到達文件末尾,返回 -1 表示出錯。

3. 寫入文件(write?系統調用)

write 系統調用將數據寫入到文件描述符指定的文件中。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open failed");return 1;}const char* msg = "Hello, world!";ssize_t bytesWritten = write(fd, msg, strlen(msg));if (bytesWritten == -1) {perror("write failed");close(fd);return 1;}std::cout << "Wrote " << bytesWritten << " bytes." << std::endl;close(fd);return 0;
}
  • O_CREAT:如果文件不存在,則創建文件。

  • 0644:文件權限,表示所有者有讀寫權限,組用戶和其他用戶有讀權限。

4. 關閉文件(close?系統調用)

close 系統調用用于關閉文件描述符,釋放資源。

close(fd);

二、網絡 IO 操作

1. 創建套接字(socket?系統調用)

socket 系統調用用于創建一個套接字,用于網絡通信。

#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 創建 TCP 套接字if (sockfd == -1) {perror("socket failed");return 1;}std::cout << "Socket created successfully, file descriptor: " << sockfd << std::endl;close(sockfd);return 0;
}
  • AF_INET:IPv4 地址族。

  • SOCK_STREAM:TCP 套接字。

  • SOCK_DGRAM:UDP 套接字。

2. 綁定地址(bind?系統調用)

bind 系統調用將套接字綁定到一個本地地址和端口。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket failed");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8080); // 端口號addr.sin_addr.s_addr = INADDR_ANY; // 綁定到所有可用地址if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {perror("bind failed");close(sockfd);return 1;}std::cout << "Socket bound to port 8080." << std::endl;close(sockfd);return 0;
}

3. 監聽連接(listen?系統調用)

listen 系統調用將套接字設置為監聽狀態,等待客戶端連接。

if (listen(sockfd, 5) == -1) { // 最大連接隊列長度為 5perror("listen failed");close(sockfd);return 1;
}std::cout << "Server is listening on port 8080." << std::endl;

4. 接受連接(accept?系統調用)

accept 系統調用接受一個客戶端連接,返回一個新的套接字用于與客戶端通信。

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);int clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);
if (clientfd == -1) {perror("accept failed");close(sockfd);return 1;
}std::cout << "Client connected." << std::endl;

5. 讀寫網絡數據

使用 readwrite 系統調用(或 recvsend 函數)進行網絡數據的讀寫。

char buffer[1024];
ssize_t bytesRead = read(clientfd, buffer, sizeof(buffer) - 1);
if (bytesRead == -1) {perror("read failed");close(clientfd);close(sockfd);return 1;
}buffer[bytesRead] = '\0';
std::cout << "Received message: " << buffer << std::endl;const char* response = "Hello, client!";
write(clientfd, response, strlen(response));

三、緩沖機制

1. 標準 IO 緩沖

C 標準庫提供了緩沖機制,通過 FILE* 指針操作文件。例如:

#include <cstdio>
#include <iostream>int main() {FILE* file = fopen("example.txt", "r");if (!file) {perror("fopen failed");return 1;}char buffer[128];while (fgets(buffer, sizeof(buffer), file)) {std::cout << buffer;}fclose(file);return 0;
}
  • fgets 從文件中讀取一行,自動處理緩沖。

  • fputs 將字符串寫入文件,也使用緩沖機制。

2. 系統調用與緩沖

系統調用(如 readwrite)通常不使用緩沖,直接與內核交互。如果需要緩沖,可以手動實現,例如:

char buffer[1024];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer));

3. 非阻塞 IO 和異步 IO

  • 非阻塞 IO:通過設置文件描述符為非阻塞模式,使 readwrite 在數據未準備好時立即返回

    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  • 異步 IO:使用 aioio_uring 等機制,允許程序在 IO 操作完成之前繼續執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76449.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wsl2+ubuntu22.04安裝blender教程(詳細教程)

本章教程介紹,如何在Windows操作系統上通過wsl2+ubuntu安裝blender并運行教程。Blender 是一款免費、開源的 ??3D 創作套件??,廣泛應用于建模、動畫、渲染、視頻編輯、特效制作等領域。它由全球開發者社區共同維護,支持跨平臺(Windows、macOS、Linux),功能強大且完全…

目標檢測YOLO實戰應用案例100講- 基于卷積神經網絡的小目標檢測算法研究與應用

目錄 知識儲備 基于改進YOLOv5的小目標檢測算法 一、環境配置(Python 3.8+) 二、核心代碼實現 1. 改進模型定義(models/yolov5s_tiny.py ) 2. 小目標數據增強(datasets/tiny_aug.py ) 3. 訓練腳本(train.py ) 三、關鍵改進點說明 四、實驗配置建議 前言 傳統…

智能DNS解析:解決高防IP地區訪問異常的實戰指南

摘要&#xff1a;針對高防IP在部分地區無法訪問的問題&#xff0c;本文設計基于智能DNS的流量調度方案&#xff0c;提供GeoDNS配置與故障切換代碼示例。 一、問題背景 運營商誤攔截或線路波動可能導致高防IP在福建、江蘇等地訪問異常。傳統切換方案成本高&#xff0c;智能DNS可…

根據 PID 找到對應的 Docker 容器

引言 在日常運維與調試過程中&#xff0c;我們常常需要查找某個進程所屬的 Docker 容器。當系統出現問題或資源異常時&#xff0c;根據進程的 PID 找到其所屬容器可以幫助我們迅速定位問題。本文將介紹如何利用 Linux 的 cgroup 機制&#xff0c;以及 Docker 提供的工具來完成…

NO.88十六屆藍橋杯備戰|動態規劃-多重背包|擺花(C++)

多重背包 多重背包問題有兩種解法&#xff1a; 按照背包問題的常規分析?式&#xff0c;仿照完全背包&#xff0c;第三維枚舉使?的個數&#xff1b;利??進制可以表??定范圍內整數的性質&#xff0c;轉化成01 背包問題。 ?建議&#xff1a;并不是所有的多重背包問題都能…

【遠程工具】0 std::process::Command 介紹

std::process::Command 是 Rust 標準庫中用于創建和配置子進程的主要類型。它允許你啟動新的進程、設置其參數和環境變量、重定向輸入/輸出等。 基本用法 use std::process::Command;let output Command::new("echo").arg("Hello, world!").output().ex…

【圖書管理系統】深入解析基于 MyBatis 數據持久化操作:全棧開發圖書管理系統獲取圖書列表接口(后端:計算圖書頁數、查詢當前頁展示的書籍)

圖書列表 實現服務器代碼(計算圖書總數量查詢當前頁需要展示的書籍) 后端響應時&#xff0c;需要響應給前端的數據 records&#xff1a;第 pageNum 頁要展示的圖書有哪些&#xff08;存儲到List集合中&#xff09;total&#xff1a;計算一共有多少本書&#xff08;用于告訴前…

如何在idea中快速搭建一個Spring Boot項目?

文章目錄 前言1、創建項目名稱2、勾選需要的依賴3、在setting中檢查maven4、編寫數據源5、開啟熱啟動&#xff08;熱部署&#xff09;結語 前言 Spring Boot 憑借其便捷的開發特性&#xff0c;極大提升了開發效率&#xff0c;為 Java 開發工作帶來諸多便利。許多大伙伴希望快速…

制作前的關鍵籌備:考試考核系統之核心要點

明確系統使用目的? 制作考試考核系統前&#xff0c;企業需明確系統使用目的&#xff0c;這是開發基石&#xff0c;不同目的決定系統功能特性。用于員工培訓考核時&#xff0c;系統要與培訓內容結合&#xff0c;能生成相應考題&#xff0c;檢驗員工知識掌握程度&#xff0c;具備…

Springboot把外部jar包打包進最終的jar包,并實現上傳服務器

1、創建lib目錄&#xff0c;把jar包放進這個目錄下&#xff0c;然后標記lib目錄為“資源根路徑”&#xff08;鼠標右鍵lib目錄->將目錄標記為->資源根路徑。之后lib文件夾會有如下的圖標變化&#xff09; 文件結構如下&#xff1a; 2、pom文件添加依賴 <dependency…

內容中臺的核心架構是什么?

數據中樞與服務API架構 在內容中臺的核心架構中&#xff0c;數據中樞作為基礎層&#xff0c;通過統一的數據模型與標準化接口&#xff0c;實現多源內容的集中存儲與治理。其核心能力體現在對結構化與非結構化數據的清洗、分類及跨系統同步&#xff0c;例如整合企業內部的CRM、…

Light RPC:一款輕量高效的Java RPC框架實踐指南

Light RPC&#xff1a;一款輕量高效的Java RPC框架實踐指南 一、框架簡介二、快速入門1. 環境準備2. 服務端配置2.1 添加依賴2.2 YAML配置2.3 接口與實現 3. 客戶端配置3.1 添加依賴3.2 YAML配置3.3 客戶端調用 三、核心設計解析四、適用場景與優勢對比五、總結 一、框架簡介 …

Hologres實時數倉在B站游戲的建設與實踐

一、背景 實時數據倉庫是近年來數據技術領域內的一大發展潮流。構建一個能夠實現高吞吐量寫入與更新、端到端全鏈路實時處理以及低延遲、高并發的實時數據倉庫&#xff0c;一直是眾多企業面臨的重大挑戰。隨著B站游戲業務的快速發展&#xff0c;對數據的實時應用需求也日益增加…

Android WiFi協議之P2P介紹與實踐

Android WiFi P2P WiFi P2P (Peer-to-Peer) 是 Android 提供的一種允許設備之間直接通過 WiFi 進行通信的技術&#xff0c;無需接入傳統的 WiFi 網絡或互聯網。這種技術也被稱為 WiFi Direct。 一、WiFi P2P 基本概念 1. 核心組件 P2P 設備&#xff1a;支持 WiFi P2P 的 And…

淺談在HTTP中GET與POST的區別

從 HTTP 報文來看&#xff1a; GET請求方式將請求信息放在 URL 后面&#xff0c;請求信息和 URL 之間以 &#xff1f;隔開&#xff0c;請求信息的格式為鍵值對&#xff0c;這種請求方式將請求信息直接暴露在 URL 中&#xff0c;安全性比較低。另外從報文結構上來看&#xff0c…

若依微服務集成Flowable仿釘釘工作流

項目簡介 本項目工作流模塊集成在若依項目單獨一個模塊&#xff0c;可實現單獨運行部署&#xff0c; 前端采用微前端&#xff0c;嵌入在若依的前端項目中。因博主是后端開發&#xff0c;對前端不是太屬性&#xff0c;沒將工作流模塊前端代碼移到若依前端。下面貼上代碼工程結構…

WPS JS宏編程教程(從基礎到進階)-- 第六部分:JS集合與映射在 WPS 的應用

目錄 第6章 JS集合與映射在 WPS 的應用6-1 集合的創建(實例:唯一值提取)示例代碼詳細解析Excel 環境模擬說明6-2 集合的不重復特性應用(案例:提取唯一值記錄)示例代碼詳細解析案例說明6-3 集合成員添加與刪除示例代碼代碼解析直觀示意(Excel 模擬表格)6-4 集合成員添加…

MySQL 約束(入門版)

目錄 一、約束的基本概念 二、約束演示 三、外鍵約束 &#xff08;一&#xff09;介紹 &#xff08;二&#xff09;外鍵約束語法 &#xff08;三&#xff09;刪除/更新行為 一、約束的基本概念 1、概念&#xff1a;約束是作用于表中字段上的規則&#xff0c;用于限制存儲…

【ISP】ISP pipeline(AI)

ISP Pipeline 全流程概覽 ISP&#xff08;Image Signal Processing&#xff0c;圖像信號處理&#xff09;流程通常從原始 Bayer 數據出發&#xff0c;經過一系列模塊處理&#xff0c;逐步完成圖像校正和增強&#xff0c;最終生成用于顯示或編碼的標準圖像。常見處理模塊包括&a…

【Rust開發】Rust快速入門,開發出Rust的第一個Hello World

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…