#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不...