文件描述符

文件描述符File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

概要

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIXLinux这样的操作系统。

每个Unix进程(除了可能的守护进程)应均有三个标准的POSIX文件描述符,对应于三个标准流

整数值 名称 <unistd.h>符号常量[1] <stdio.h>文件流[2]
0 Standard input STDIN_FILENO stdin
1 Standard output STDOUT_FILENO stdout
2 Standard error STDERR_FILENO stderr

优点

文件描述符的优点主要有两个:

  • 基于文件描述符的I/O操作兼容POSIX标准。
  • 在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。

例如,下面的代码就示范了如何基于文件描述符来读取当前目录下的一个指定文件,并把文件内容打印至主控臺。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main (void){
    int fd;
    int numbytes;
    char path[] = "file";
    char buf[256];

    /*
     * O_CREAT:如果文件不存在则创建
     * O_RDONLY:以只读模式打开文件
     */
    fd = open(path, O_CREAT | O_RDONLY, 0644);
    if(fd < 0){
        perror("open()");
        exit(EXIT_FAILURE);
    }

    memset(buf, 0x00, 256);
    while((numbytes = read(fd, buf, 255)) > 0){
        printf("%d bytes read: %s", numbytes, buf);
        memset(buf, 0x00, 256);
    }
    close (fd);
    exit(EXIT_SUCCESS);
}

此外,在Linux系列的操作系统上,由于Linux的设计思想便是把一切设备都视作文件。因此,檔案描述子的存在提供了程式操作裝置的統一方法。

缺点

文件描述符的概念存在两大缺点:

  • 在非UNIX/Linux 操作系统上(如Windows),无法基于这一概念进行编程——事实上,Windows下的文件描述符和信号量互斥锁内核对象一样都记作HANDLE。
  • 由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,哪些意味着文件描述符。因此,完成的代码可读性也就会变得很差,这一点一般通过使用名称有文字意义的魔术数字进行替换来解决。

其他

  • 对于ANSI C规范中定义的标准库的文件I/O操作。ANSI C规范给出了一个解决方法,就是使用FILE结构体的指针。事实上,UNIX/Linux平台上的FILE结构体的实现中往往都是封装了文件描述符变量在其中。
  • 在UNIX/Linux平台上,对于控制台(Console)的标准输入标准输出标准错误输出也对应了三个文件描述符。它们分别是0,1,2。在实际编程中,如果要操作这三个文件描述符时,建议使用<unistd.h>头文件中定义的三个宏来表示:STDIN_FILENO, STDOUT_FILENO以及STDERR_FILENO.
  • 对于一个进程而言,文件描述符的变化范围为0~OPEN_MAX[註 1].

与文件描述符相关的操作

文件描述符的生成

  • open(), creat()
  • socket()
  • socketpair()
  • pipe()

与单一文件描述符相关的操作

  • read(), write()
  • recv(), send()
  • recvmsg(), sendmsg()
  • sendfile()
  • lseek()
  • fstat()
  • fchmod()
  • fchown()

与复数文件描述符相关的操作

  • select(), pselect()
  • poll(),epoll()

与文件描述符表相关的操作

  • close()
  • dup()
  • dup2()
  • fcntl (F_DUPFD)
  • fcntl (F_GETFD and F_SETFD)

改变进程状态的操作

  • fchdir()
  • mmap()

与文件加锁的操作

  • flock()
  • fcntl (F_GETLK, F_SETLK and F_SETLKW)
  • lockf()

与套接字相关的操作

  • connect()
  • bind()
  • listen()
  • accept()
  • getsockname()
  • getpeername()
  • getsockopt(), setsockopt()
  • shutdown()

其他

  • ioctl()

注释

  1. ^ OPEN_MAX定义在头文件limits.h中。

参考文献

  1. ^ The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. [2016-10-24]. (原始内容存档于2021-03-13). 
  2. ^ The IEEE and The Open Group. <stdio.h>. The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. [May 31, 2014]. (原始内容存档于2020-09-23). 

Read other articles:

Bagian dari seri tentangBuddhisme Awal Teks Buddhis Teks Buddhis Awal Bhāṇaka Tipiṭaka Nikāya Āgama Teks Buddhis Gandhāra Jataka Avadana Abhidharma Sidang Buddhis Pertama Kedua Ketiga Keempat Buddhisme Awal Buddhisme prasektarian → Aliran Buddhis awal Mahāsāṃghika Ekavyāvahārika Lokottaravāda Gokulika Bahuśrutīya Prajñaptivāda Caitika (Haimavata) Sthavira nikāya (Sthaviravāda) Pudgalavāda Vātsīputrīya Saṃmitīya Sarvāstivāda (Haimavata) (Kāśyapīya) (Mahīśā...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Newmarket Junior-Senior High School – news · newspapers · books · scholar · JSTOR (January 2017) (Learn how and when to remove this template message) 43°04′29″N 70°56′44″W / 43.07472°N 70.94556°W / 43.07472; -70.94556 Newmark...

 

American actress (born 1995) This biography of a living person needs additional citations for verification. Please help by adding reliable sources. Contentious material about living persons that is unsourced or poorly sourced must be removed immediately from the article and its talk page, especially if potentially libelous.Find sources: Sammi Hanratty – news · newspapers · books · scholar · JSTOR (September 2018) (Learn how and when to remove this tem...

RulesAlbum studio karya The Whitest Boy AliveDirilis3 Maret 2009GenreMinimalist Pop, indie popLabelBubbles RecordsKronologi The Whitest Boy Alive Dreams(2006)Dreams2006 Rules(2009) Rules adalah album studio kedua dari The Whitest Boy Alive. Album ini direkam ketika mereka sedang menjalankan promo tour di Meksiko. Seluruh lagu di album ini telah beredar secara ilegal di internet sejak Januari 2009. Daftar lagu “Keep a Secret” “Intentions” “Courage” “Timebomb” “Rollercoast...

 

The Uncensored LibraryBerkas:The Uncensored Library Front.jpg TipePeladen Minecraft Versi pertama12 Maret 2020; 4 tahun lalu (2020-03-12)GenrePeta dan peladen MinecraftInformasi pengembangPengembangBerlin DDB, BlockWorks, MediaMonks, Reporters Without Borders[a]PenyuntingMediaMonks Reporters Without Borders Informasi tambahanSitus webuncensoredlibrary.com Sunting di Wikidata  • Sunting kotak info • L • BBantuan penggunaan templat ini The Uncensored Library (P...

 

1818–19 United States Senate elections ← 1816 & 1817 Dates vary by state 1820 & 1821 → 14 of the 42 seats in the United States Senate (plus special elections)22 seats needed for a majority   Majority party Minority party   Party Democratic-Republican Federalist Last election 25 seats 13 seats Seats before 28 12 Seats won 14 0 Seats after 30 9 Seat change 3 3 Seats up 11 3 Results:     Dem-Republican h...

В этом китайском имени фамилия (Дуань) стоит перед личным именем. Дуань Цижуйкит. трад. 段祺瑞 Президент Китайской республики 1 июля — 13 июля 1917 Предшественник Ли Юаньхун Преемник Ли Юаньхун 24 ноября 1924 — 20 апреля 1926 Предшественник Хуан Фу Преемник Ху Вэйдэ Председате...

 

Metro station in Brussels, Belgium Houba-Brugmann metro stationGeneral informationLocationAvenue Houba De Strooper / Houba De StrooperlaanB-1020 Laeken, City of Brussels, Brussels-Capital Region, BelgiumCoordinates50°53′25″N 4°20′13″E / 50.89028°N 4.33694°E / 50.89028; 4.33694Owned bySTIB/MIVBPlatforms1 island platformTracks2ConstructionStructure typeUndergroundHistoryOpened5 July 1985; 38 years ago (1985-07-05)Services Preceding station B...

 

此條目可参照英語維基百科相應條目来扩充。 (2021年5月6日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 约翰斯顿环礁Kalama Atoll 美國本土外小島嶼 Johnston Atoll 旗幟颂歌:《星條旗》The Star-Spangled Banner約翰斯頓環礁�...

1999 Rally Catalunya35th Rallye Catalunya - Costa BravaRound 5 of the 1999 World Rally Championship season← Previous eventNext event →Host country SpainRally baseLloret de MarDates runApril 19, 1999 – April 21, 1999Length396.01 km (246.07 miles)Stage surfaceAsphaltOverall distance1,697.65 km (1,054.87 miles)StatisticsCrews109 at start, 56 at finishOverall resultsOverall winner Philippe Bugalski Automobiles CitroënCitroën Xsara Kit Car The 1999 Ra...

 

River in Oregon, United States of America Applegate RiverApplegate Lake on the Applegate RiverLocation of the mouth of the Applegate River in OregonEtymologyNamed after Lindsay Applegate, part of a group that prospected along the river in 1848[2]LocationCountryUnited StatesStateOregon, CaliforniaCountySiskiyou in California, Jackson and Josephine in OregonPhysical characteristicsSourceConfluence of Butte Fork Applegate River and Middle Fork Applegate River • locat...

 

Main article: 2016 United States presidential election 2016 United States presidential election in New Jersey ← 2012 November 8, 2016 2020 → Turnout68%   Nominee Hillary Clinton Donald Trump Party Democratic Republican Home state New York New York Running mate Tim Kaine Mike Pence Electoral vote 14 0 Popular vote 2,148,278 1,601,933 Percentage 55.45% 41.35% County results Municipality Results Congressional district results Clinton   40...

Bagian dari seri tentangBuddhisme Awal Teks Buddhis Teks Buddhis Awal Bhāṇaka Tripiṭaka awal Nikāya Āgama Teks Buddhis Gandhāra Jataka Avadana Abhidharma Sidang Buddhis Pertama Kedua Ketiga Keempat Buddhisme Awal Buddhisme prasektarian → Aliran Buddhis awal Mahāsāṃghika Ekavyāvahārika Lokottaravāda Gokulika Bahuśrutīya Prajñaptivāda Caitika (Haimavata) Sthavira nikāya (Sthaviravāda) Pudgalavāda Vātsīputrīya Saṃmitīya Sarvāstivāda (Haimavata) (Kāśyapīya) (Mah...

 

West End theatre in London, England This article is about the theatre in Westminster. For the New Zealand theatre, see Fortune Theatre, Dunedin. For the historic London theatre, see Fortune Playhouse. For other uses, see Fortune. Fortune TheatreFortune Thriller TheatreShowing The Woman in Black, 2006AddressRussell StreetLondon, WC2United KingdomCoordinates51°30′47″N 0°07′16″W / 51.513°N 0.121°W / 51.513; -0.121Public transit Covent GardenOwnerAmbassador The...

 

Chemical compound BMS-906024Identifiers IUPAC name (2R,3S)-N-[(3S)-1-Methyl-2-oxo-5-phenyl-2,3-dihydro-1H-1,4-benzodiazepin-3-yl]-2,3-bis(3,3,3-trifluoropropyl)succinamide CAS Number1401066-79-2PubChem CID66550890PubChem SID152143555ChemSpider28536138UNIIDRL23N424RCompTox Dashboard (EPA)DTXSID30161234 Chemical and physical dataFormulaC26H26F6N4O3Molar mass556.509 g·mol−13D model (JSmol)Interactive image SMILES CN1c2ccccc2C(=N[C@@H](C1=O)NC(=O)[C@H](CCC(F)(F)F)[C@H](CCC(F)(F)F)C(=...

Fencingat the Games of the XVI Olympiad← 19521960 → At the 1956 Summer Olympics, seven fencing events were contested, six for men and one for women.[1] Medal summary Men's events Event Gold Silver Bronze individual épéedetails Carlo Pavesi Italy Giuseppe Delfino Italy Edoardo Mangiarotti Italy team épéedetails  Italy (ITA)Giuseppe DelfinoFranco BertinettiAlberto PellegrinoGiorgio AnglesioCarlo PavesiEdoardo Mangiarotti  Hungary&...

 

Mass Rapid Transit line in Singapore Thomson–East Coast LinePlatforms of Bayshore MRT station, the current eastern terminus of the lineOverviewNative nameMalay: Laluan MRT Thomson-Pantai TimurChinese: 汤申-东海岸地铁线Tamil: தாம்சன் - ஈஸ்ட் கோஸ்ட் எம்ஆர்டி வழிStatusOperational (Stages 1–4)Under construction (Stage 5)Under planning (extension to Changi Airport)OwnerLand Transport AuthorityLocaleSingaporeTerminiWoodlands ...

 

Disambiguazione – Se stai cercando Bianca Sforza, vedi Bianca Giovanna Sforza. Disambiguazione – Se stai cercando l'omonima marchesa di Caravaggio, vedi Bianca Maria Sforza di Caravaggio. Questa voce o sezione sull'argomento nobili italiani non cita le fonti necessarie o quelle presenti sono insufficienti. Puoi migliorare questa voce aggiungendo citazioni da fonti attendibili secondo le linee guida sull'uso delle fonti. Bianca Maria SforzaRitratto di Bianca Maria Sforza, imperatrice...

SchoolGermiston High School[1]LocationGermiston High School, Rand Airport Road Germiston, Elandsfontein 108-Ir, Johannesburg, 2043InformationFormer nameSecondary School Germiston SouthMottoScientia et Humanitas(Science and Culture)Established10 September 1917FounderMr. C.R HardingSchool districtEkurhuleni WestPrincipalMs R. GoosenWebsitegermistonhs.co.za Germiston High School (established September 1917 ) is a South African English-medium government school based in Germiston. It is t...

 

American transport legislation The Oregon Bicycle Bill (ORS 366.514) is transportation legislation passed in the U.S. state of Oregon in 1971. It requires the inclusion of facilities for pedestrians and bicyclists wherever a road, street or highway is being constructed or reconstructed and applies to the Oregon Department of Transportation (ODOT) as well as Oregon cities and counties.[1] The law requires that in any given fiscal year, a minimum of 1% of the state highway fund received...