原创 Linux編程基礎:read/write函數以及(非)阻塞I/O的概念

一、read/write 函數 read函數從打開的設備或文件中讀取數據。 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回讀

原创 Linux網絡編程之socket:select函數的併發限制與poll函數

一、用select實現的併發服務器,能達到的併發數,受兩方面限制 1、一個進程能打開的最大文件描述符限制。這可以通過調整內核參數。可以通過ulimit -n來調整或者使用setrlimit函數設置, 但一個系統所能打開的最大數也是有限的

原创 Linux編程基礎:C標準IO庫函數與Unbuffered IO函數

先來看看C標準I/O庫函數是如何用系統調用實現的。  fopen(3)  調用open(2)打開指定的文件,返回一個文件描述符(就是一個int 類型的編號),分配一 個FILE 結構體, 通常裏面包含了: 文件fd緩衝區指針緩衝區長度當

原创 Linux網絡編程之socket:socket與字節序以及地址轉換函數

一、什麼是socket socket可以看成是用戶進程與內核網絡協議棧的編程接口。 socket不僅可以用於本機的進程間通信,還可以用於網絡上不同主機的進程間通信。 socket API是一層抽象的網絡編程接口,適用於各種底層網

原创 Linux網絡編程:信號

一、爲了理解信號,先從我們最熟悉的場景說起: 1. 用戶輸入命令,在Shell下啓動一個前臺進程。 2. 用戶按下Ctrl-C,這個鍵盤輸入產生一個硬件中斷。 3. 如果CPU當前正在執行這個進程的代碼,則該進程的用戶空間代碼暫停執行,C

原创 Linux編程基礎:C標準庫IO緩衝區與內核緩衝區的區別

1.C標準庫的I/O緩衝區          UNIX的傳統 是Everything is a file,鍵盤、顯示器、串口、磁盤等設備在/dev 目錄下都有一個特殊的設備文件與之對應,這些設備文件也可以像普通文件(保存在磁盤上的文件)一

原创 Linux編程之socket:tcp流協議產生的粘包問題及解決方法

首先說明的是發送端可以是一K一K地發送數據,而接收端的應用程序可以兩K兩K地提走數據,當然也有可能一次提走3K或6K數據,或者一次只提走幾個字節的數據,也就是說,應用程序所看到的數據是一個整體,或說是一個流(stream),一條消息有多少

原创 linux網絡編程之套接字:套接字I/O超時設置方法和用select實現超時

一、使用alarm 函數設置超時 void handler(int sig) { } signal(SIGALRM, handler); alarm(5); int ret = read(fd, buf, sizeof(buf)); i

原创 Linux網絡編程之socket:使用select函數實現併發處理

一、當我們使用單進程單連接且使用read的客戶端程序,去連接服務器端程序,會出現一個有趣的現象,先來看輸出: 先運行服務器端,再運行客戶端。 可以先查看一下網絡狀態。 可以看出建立了連接,服務器端有兩個進程,一個父進程處

原创 Linux系統編程:目錄的操作

一、目錄的訪問 1.功能說明:打開一個目錄 原型:DIR*  opendir(char *pathname); 返回值:打開成功,返回一個目錄指針打開失敗,則返回NULL 2.功能說明:訪問指定目錄中下一個連接的細節

原创 Linux系統編程:文件的讀取寫入

一、read系統調用 一旦有了與一個打開文件描述相關連的文件描述符,只要該文件是用O_RDONLY或O_RDWR標誌打開的,就可以用read()系統調用從該文件中讀取字節  函數原型: ssize_t read(int fd, v

原创 Linux網絡編程之socket:由一個進程發起多個連接

一、一個客戶端即一個進程,只會發起一個連接,只要稍微修改一下就可以讓一個客戶端發起多個連 接,然後只利用其中一個連接發送數據。 首先了解一個函數getsocketname #include <sys/socket.h>

原创 Linux網絡編程之socket:使用fork併發處理多個client的請求和對等通信P2P

一、如何同時服務多個客戶端呢?在未講到select/poll/epoll等高級IO之前,比較老土的辦法是使用fork來實現。網絡服務器通常用fork來同時服務多個客戶端,父進程專門負責監聽端口,每次accept一個新的客戶端連接就fork

原创 Linux系統編程:文件的屬性

一、讀取文件元數據 #include <sys/stat.h>int stat(const char *restrict pathname, struct stat *restrict buf);提供文件名字,獲取文件對應屬性。int

原创 Linux編程基礎:文件描述符file descriptor與inode

每個進程在Linux內核中都有一個task_struct結構體來維護進程相關的 信息,稱爲進程描述符(Process Descriptor),而在操作系統理論中稱爲進程控制塊 (PCB,Process Control Block)。tas