《TCP IP網路程式設計》第十一章 程序間通訊

2021-10-08 00:07:14 字數 3450 閱讀 4961

#include

intpipe

(int filedes[2]

);filedes[

0] 通過管道接收資料時使用的檔案描述符,管道出口

filedes[

1] 通過管道傳輸資料時使用的檔案描述符,管道入口

成功返0,失敗返-

1

通過乙個管道進行資料互動:

資料進入管道後成為無主資料,誰先呼叫read誰先獲取資料,故將資料寫入管道後要sleep一段時間再read。

sleep(3);睡眠3秒是為了顯示時格式不錯亂。

[root@vm_0_10_centos communication]# cat pipe2.c

#include

#include

#define buf_size 30

intmain

(int argc,

char

* ar**)

else

return0;

}

雙向通訊的正確開啟方式:使用兩個管道:

#include

#include

#define buf_size 30

intmain

(int argc,

char

* ar**)

else

return0;

}

更完備的回聲伺服器端:

能夠儲存客戶端發來的資料到指定的檔案中。累積到10條內容後就不再儲存了。

將儲存任務委託給另外的程序:另行建立程序,從向客戶端提供服務的程序讀取字串資訊。

[root@vm_0_10_centos communication]# cat echo_storeserv.c 

#include

#include

#include

#include

#include

#include

#include

#include

#define buf_size 30

void

error_handling

(char

* message)

;void

read_childproc

(int sig)

;int

main

(int argc,

char

* ar**)

act.sa_handler = read_childproc;

sigemptyset

(&act.sa_mask)

; act.sa_flags =0;

state =

sigaction

(sigchld,

&act,0)

; serv_sock =

socket

(pf_inet,sock_stream,0)

;memset

(&serv_adr,0,

sizeof

(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr =

htonl

(inaddr_any)

; serv_adr.sin_port =

htons

(atoi

(ar**[1]

));if

(bind

(serv_sock,

(struct sockaddr*

)&serv_adr,

sizeof

(serv_adr))==

-1)if

(listen

(serv_sock,5)

==-1)

pipe

(fds)

; pid =

fork()

;if(pid ==0)

fclose

(fp)

;return0;

}while(1

)else

pid =

fork()

;if(pid ==-1

)if(pid ==0)

close

(clnt_sock)

;puts

("client disconnected...");

return0;

}else

}close

(serv_sock)

;return0;

}void

read_childproc

(int sig)

void

error_handling

(char

* message)

不要只圖快,充滿功利主義。即使開始時只想學習必要部分,最後也會需要掌握所有內容。

課後習題:

1、什麼是程序間通訊?分別從概念和記憶體的角度進行說明

概括性地說,程序間通訊是指兩個程序之間交換資料。但是從記憶體的角度看,可以理解為兩個程序共有記憶體。因為共享的記憶體區域存在,可以進行資料交換

2、程序間通訊需要特殊的ipc機制,這是由作業系統提供的。程序間通訊時為何需要作業系統的幫助?

要想實現ipc機制,需要共享的記憶體,但由於兩個程序之間不共享記憶體,因此需要作業系統的幫助,也就是說,兩程序共享的記憶體空間必須由作業系統來提供

3、「管道」是典型的ipc技術。關於管道,請回答如下問題。

(1)管道是程序間交換資料的路徑。如何建立該路徑?由誰建立?

管道是由pipe函式產生的,而實際產生管道的主體是作業系統

(2)為了完成程序間通訊,2個程序需同時連線管道。那2個程序如何連線到同一管道?

pipe函式通過輸入引數返回管道的輸入輸出檔案描述符。這個檔案描述符在fork函式中複製到了其子程序,因此,父程序和子程序可以同時訪問同一管道。

(3)管道允許進行2個程序間的雙向通訊。雙向通訊中需要注意哪些內容?

管道並不管理程序間的資料通訊。因此,如果資料流入管道,任何程序都可以讀取資料。因此,要合理安排共享空間的輸入和讀取

4、編寫示例複習ipc技術,使2個程序相互交換3次字串…

#include

#include

#include

#define buf_size 30

intmain()

;char buf[buf_size]

;pipe

(fds1)

,pipe

(fds2)

; pid =

fork()

;if(pid ==0)

}else

}}

第十一章 程序間通訊

1.管道的定義 當從乙個連線資料流到另乙個程序時,我們使用術語管道 pipe 對於shell命令來說,命令的連線是通過管道字元來完成的,如下所示 cmd1 cmd2 shell負責安排兩個命令的標準輸入和標準輸出。cmd1的標準輸入來自終端鍵盤。cmd1的標準輸出傳遞給cmd2,作為它的標準輸入。c...

第十一章 網路程式設計

每個網路應用都是基於客戶端 服務端模型的。根據這個模型,乙個用用是由乙個伺服器和乙個或多個客戶端組成的。伺服器管理資源,以某種方式操作資源,為客戶端服務。例如,乙個web伺服器管理著一組磁碟檔案,它會代表客戶端進行檢索和執行。客戶端 服務端模型中的基本操作是事務。乙個客戶端 伺服器事務由以下四步組成...

Linux C王者歸來 第十一章 程序控制

1.程式可以有多個程序,乙個程序與程序id11 對應 2.proc中的數字對應id號,getpid和getppid可以獲得程序id父程序id 3.getuid geteuid 獲得程序使用者id和有效使用者id 4.getgid和getegid獲得程序的組id合有效組id 5.程序id和父程序id不...