與消息隊列和共享內存一樣,信號量集也有自己的數據結構:struct semid_ds {struct ipc_perm sem_perm; /* Ownership and permissions */time_t &nbs
用信號量實現進程互斥示例和解決哲學家就餐問題一、我們在前面講進程間通信的時候提到過進程互斥的概念,下面寫個程序來模擬一下,程序流程如下圖:即父進程打印字 符O,子進程打印字符X,每次打印一個字符後要sleep 一下,這裡要演示的效果是,
基於生產者-消費者模型實現先進先出的共享內存段生產者消費者問題:該問題描述了兩個共享固定大小緩沖區的進程——即所謂的“生產者”和“消費者”—&mdash
在前面介紹了system v 共享內存的相關知識,現在來稍微看看posix 共享內存 和系列函數。共享內存簡單來說 就是一塊真正的物理內存區域,可以使用一些函數將這塊區域映射到進程的地址空間進行讀寫,而posix 共享內存與system
一、在前面介紹了system v 消息隊列的相關知識,現在來稍微看看posix 消息隊列。其實消息隊列就是一個可 以讓進程間交換數據的場所,而兩個標准的消息隊列最大的不同可能只是api 函數的不同,如system v 的系列函數是 ms
一、什麼是socketsocket可以看成是用戶進程與內核網絡協議棧的編程接口。socket不僅可以用於本機的進 程間通信,還可以用於網絡上不同主機的進程間通信。socket API是一層抽象的網絡編程接口,適用於各種底層網絡協議,如I
一、基於TCP協議的網絡程序下圖是基於TCP協議的客戶端/服務器程序的一般流程:服務器調用socket()、bind() 、listen()完成初始化後,調用accept()阻塞等待,處於監聽端口的狀態,客戶端調用socket()初始化
下面通過最簡單的客戶端/服務器程序的實例來學習socket API。echoser.c 程序的功能是從客戶端讀取字符 然後直接回射回去。/*************************************************
使用fork並發處理多個client的請求和對等通信p2p一、在前面講過的回射客戶/服務器程序中,服務器只能處理一個客戶端的請求,如何同時服務多個客戶端呢?在未講到 select/poll/epoll等高級IO之前,比較老土的辦法是使用
我們在前面曾經說過,發送端可以是一K一K地發送數據,而接收端的應用程序可以兩K兩K地提走數據,當然也有可能一 次提走3K或6K數據,或者一次只提走幾個字節的數據,也就是說,應用程序所看到的數據是一個整體,或說是一個流 (stream),
在前面的文章中,我們為了避免粘包問題,實現了一個readn函數讀取固定字節的數據。如果應用層協議的各字段長度固 定,用readn來讀是非常方便的。例如設計一種客戶端上傳文件的協議,規定前12字節表示文件名,超過12字節的文件名截 斷,不
一、在前面講過的最簡單的回射客戶/服務器程序中,一個客戶端即一個進程,只會發起一個連接,只要稍微修改一下就 可以讓一個客戶端發起多個連接,然後只利用其中一個連接發送數據。先來認識一個函數getsockname #include
一、五種I/O模型1、阻塞I/O我們在前面所說的I/O模型都是阻塞I/O,即調用recv系統調用,如果沒有數據則阻塞等待,當數據到來則將數據從內核 空間(套接口緩沖區)拷貝到用戶空間(recv函數提供的buf),然後recv返回,進行數
一、當我們使用單進程單連接且使用readline修改後的客戶端程序,去連接使用readline修改後的服務器端程序,會出 現一個有趣的現象,先來看輸出:先運行服務器端,再運行客戶端,simba@ubuntu:~/Documents/co
假設server和client 已經建立了連接,server調用了close, 發送FIN 段給client(其實不一定會發送FIN段,後面再說 ),此時server不能再通過socket發送和接收數據,此時client調用read,如
一、使用alarm 函數設置超時void handler(int sig){}signal(SIGALRM, handler); alarm(5);int ret = read(fd, buf, sizeof(buf));if (
一、用select實現的並發服務器,能達到的並發數,受兩方面限制1、一個進程能打開的最大文件描述符限制。 這可以通過調整內核參數。可以通過ulimit -n來調整或者使用setrlimit函數設置, 但一個系統所能打開的最大數也是有 限
一、epoll 系列函數簡介#include <sys/epoll.h>int epoll_create(int size);int epoll_create1(int flags);int epoll_ctl(int ep
一、下圖是典型的UDP客戶端/服務器通訊過程下面依照通信流程,我們來實現一個UDP回射客戶/服務器#include <sys/types.h>#include <sys/socket.h> ssize_