apue學習筆記(第十七章 高級進程間通訊)

本章介紹一種高級IPC---UNIX域套接字機制,並說明它的應用方法服務器

 

 

UNIX域套接字網絡

UNIX域套接字用於在同一臺計算機上運行的進程(無關進程)之間的(全雙工)通訊。相比於因特網套接字,UNIX域套接字效率更高。dom

UNIX域套接字僅僅複製數據,不執行協議處理,不須要添加或刪除網絡報頭,無需計算校驗和,不要產生順序號,無需發送確認報文。socket

UNIX域套接字提供流和數據報兩種接口,就像是套接字和管道的混合(雙向的通訊),使用socketpair函數建立一對無命名的、相互鏈接的UNIX域套接字ide

#include <sys/socket.h>
int socketpair(int domain,int type,int protocol,int sockfd[2]);

也能夠使用它們面向網絡的域套接字接口(socket)創建該套接字。函數

一對相互鏈接的UNIX域套接字能夠起到全雙工管道的做用:兩端對讀和寫開放。學習

 

 

命名UNIX域套接字spa

上一章學習了而後將一個地址綁定到一個因特網域套接字上。跟因特網域套接字同樣,能夠命名UNIX域套接字,並可將其用於告示服務。code

UNIX域套接字的地址由sockaddr_un結構表示,在Linux 3.2.0和Solaris 10中定義以下blog

struct sockaddr_un 
{
    sa_family_t sun_family;   /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX];   /* pathname */
};

sun_path成員包含一個路徑名。當咱們將一個地址綁定到一個UNIX域套接字時,系統會用該路徑名建立一個S_IFSOCK類型的文件。

該文件僅用於向用戶進程告示套接字名字。該文件沒法打開,也不能由應用程序用於通訊。

下面程序是一個將地址綁定到UNIX域套接字的例子。

 1 #include "apue.h"
 2 #include <sys/socket.h>
 3 #include <sys/un.h>
 4 
 5 int
 6 main(void)
 7 {
 8     int fd, size;
 9     struct sockaddr_un un;
10 
11     un.sun_family = AF_UNIX;
12     strcpy(un.sun_path, "foo.socket");
13     if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
14         err_sys("socket failed");
15     size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path);
16     if (bind(fd, (struct sockaddr *)&un, size) < 0)
17         err_sys("bind failed");
18     printf("UNIX domain socket bound\n");
19     exit(0);
20 }
View Code

下面是程序的運行狀況

 

 

 

惟一鏈接

服務器進程能夠使用標準的bind、listen和accept函數,爲客戶進程安排一個惟一UNIX域鏈接。

客戶進程使用connect與服務器進程聯繫,在服務器進程接受了connect請求後,在服務器進程和客戶進程之間就存在了惟一鏈接。

 

相關文章
相關標籤/搜索