分離I/O流
上一章中使用文件描述符的套接字沒有辦法半關閉件缸,即沒有辦法關閉自己的發(fā)送端,而仍可接收對方的消息叔遂。因為讀寫兩個模式的FILE指針都是基于同一個文件描述符創(chuàng)建的他炊。
# gcc sep_serv.c -o sep_serv
# ./sep_serv 9190
Connected client.
# gcc sep_clnt.c -o sep_clnt
# ./sep_clnt 127.0.0.1 9190
Connected
FROM SERVER: Hi!
FROM SERVER: Nice to meet you.
但我們可以在創(chuàng)建FILE指針前先復制文件描述符,銷毀所有文件描述符才能銷毀套接字已艰。
文件描述符的復制和半關閉
#include <unistd.h>
/*
* @params
* fildes: 需要復制的文件描述符
* fildes2: 明確指定的文件描述符整數(shù)值
*/
int dup(int fildes); // 成功時返回復制的文件描述符痊末,失敗時返回-1
int dup2(int fildes, int fildes2);
驗證這兩個函數(shù)的功能:
# gcc dup.c -o dup
# ./dup
fd1=3, fd2=7
Hi~
It's a nice day~
Hi~
修改服務器端使其可以進入半關閉狀態(tài):
# gcc sep_serv2.c -o sep_serv2
# ./sep_serv2 9190
Connected client.
FROM CLIENT: Thank you!
# ./sep_clnt 127.0.0.1 9190
Connected
FROM SERVER: Hi!
FROM SERVER: Nice to meet you.
習題
- 下列關于FILE結構體指針和文件描述符的說法錯誤的是?
a. 與FILE結構體指針相同哩掺,文件描述符也分輸入描述符和輸出描述符
b. 復制文件描述符時將生成相同值的描述符凿叠,可以通過這2個描述符進行I/O
c. 可以利用創(chuàng)建套接字時返回的文件描述符進行I/O ,也可以不通過文件描述符嚼吞,直接通過FILE結構體指針完成
d. 可以從文件描述符生成FILE結構體指針盒件,而且可以利用這種FILE結構體指針進行套接字I/O
e. 若文件描述符為讀模式,則基于該描述符生成的FILE結構體指針同樣是讀模式舱禽;若文件描述符為寫模式炒刁,則基于該描述符生成的FILE結構體指針同樣是寫模式
abe棉安。- EOF的發(fā)送相關描述中錯誤的是叹侄?
a. 終止文件描述符時發(fā)送EOF
b. 即使未完全終止文件描述符难咕,關閉輸出流時也會發(fā)送EOF
c. 如果復制文件描述符傲武,則包括復制的文件描述符在內木蹬,所有文件描述符都終止時才會發(fā)送EOF
d. 即使復制文件描述符惕稻,也可以通過調用shutdown函數(shù)進入半關閉狀態(tài)并發(fā)送EOF
abc悉稠。
附錄
[1] Github