dup與賦值語(yǔ)句用于文件描述符的區(qū)別(聚合)
進(jìn)程要對(duì)文件進(jìn)行操作,一般使用open調(diào)用打開一個(gè)文件進(jìn)行訪問(wèn),每個(gè)進(jìn)程都有一個(gè)文件描述符表,該表中存放打開的文件描述符。用戶使用open等調(diào)用得到的文件描述符其實(shí)是文件描述符在該表中的索引號(hào),該表項(xiàng)的內(nèi)容是一個(gè)指向文件表的指針。應(yīng)用程序只要使用該描述符就可以對(duì)指定文件進(jìn)行操作。
為了了解dup與賦值語(yǔ)句用于文件描述符的區(qū)別,請(qǐng)看如下程序。
程序描述:
打開一個(gè)文件描述符,分別適用dup和賦值語(yǔ)句進(jìn)行復(fù)制,復(fù)制之后,打印原始和被復(fù)制的文件描述符id,看看是否具有相同的值,然后關(guān)閉文件,測(cè)試關(guān)閉是否成功。
程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int sys_err(char *str)
{
puts(str);
exit(0);
}
int main(void)
{
int p,q;
if((p=open("c_fid.c", O_RDONLY)) == -1)
sys_err("open error");
q = dup(p);
puts("dup:");
printf("file p,q fd is:%d %d\n", q, p);
printf("close file p ok?: %d\n", close(p));
printf("close file q ok?: %d\n", close(q));
if((p=open("c_fid.c", O_RDONLY)) == -1)
sys_err("open error");
q = p;
puts("=:");
printf("file p,q fd is:%d %d\n", q, p);
printf("close file p ok?: %d\n", close(p));
printf("close file q ok?: %d\n", close(q));
return 0;
}
程序運(yùn)行結(jié)果:
dup:
file p,q fd is:4 3 //文件p,q使用不同的文件描述符
close file p ok?: 0
close file q ok?: 0 //文件關(guān)閉成功
=:
file p,q fd is:3 3 //簡(jiǎn)單復(fù)制
close file p ok?: 0
close file q ok?: -1//關(guān)閉失敗,原因是此描述符已經(jīng)被關(guān)閉了
由此證明,dup是產(chǎn)生一個(gè)新的文件描述符id和指針在進(jìn)程表項(xiàng)中,但是他們共用文件表,這時(shí),關(guān)閉一個(gè)文件描述符,另外一個(gè)仍舊可用,文件表并不會(huì)被釋放。而賦值語(yǔ)句不同,它只是簡(jiǎn)單的在另外一個(gè)變量中記錄原始文件指針等,2個(gè)變量的文件描述符相同,進(jìn)程表項(xiàng)中并不產(chǎn)生新的項(xiàng)目。
關(guān)于socket的文件描述符
socket接口增加了網(wǎng)絡(luò)通信操作的抽象定義,與文件操作一樣,每個(gè)打開的socket都對(duì)應(yīng)一個(gè)整數(shù),我們稱它為socket描述符,該整數(shù)也是socket描述符在文件描述符表中的索引值。但socket描述符在描述符表中的表項(xiàng)并不指向文件表,而是指向一個(gè)與該socket有關(guān)的數(shù)據(jù)結(jié)構(gòu)。BSD UNIX中新增加了一個(gè)socket調(diào)用,應(yīng)用程序可以調(diào)用它來(lái)新建一個(gè)socket描述符,注意進(jìn)程用open只能產(chǎn)生文件描述符,而不能產(chǎn)生socket描述符。socket調(diào)用只能完成建立通信的部分工作,一旦建立了一個(gè)socket,應(yīng)用程序可以使用其他特定的調(diào)用來(lái)為它添加其他詳細(xì)信息,以完成建立通信的過(guò)程。
posted on 2009-12-22 10:10 攀升 閱讀(907) 評(píng)論(0) 編輯 收藏 引用 所屬分類: Linux

