logo

Ievades-izejas sistēmas izsaukumi C | Izveidot, atvērt, aizvērt, lasīt, rakstīt

Sistēmas izsaukumi ir zvani, ko programma veic sistēmas kodolam, lai nodrošinātu pakalpojumus, kuriem programmai nav tiešas piekļuves. Piemēram, nodrošinot piekļuvi ievades un izvades ierīcēm, piemēram, monitoriem un tastatūrām. Mēs varam izmantot dažādas C programmēšanas valodā nodrošinātās funkcijas ievades/izvades sistēmas izsaukumiem, piemēram, izveidot, atvērt, lasīt, rakstīt utt.

Pirms mēs pārietam uz I/O sistēmas izsaukumiem, mums ir jāzina daži svarīgi termini.



cik liels ir mans monitors

Svarīga terminoloģija

Kas ir faila deskriptors?

Faila deskriptors ir vesels skaitlis, kas unikāli identificē procesa atvērtu failu.

Failu deskriptora tabula: fails deskriptoru tabula ir veselu skaitļu masīvu indeksu kolekcija, kas ir failu deskriptori, kuros elementi ir norādes uz failu tabulas ierakstiem. Katram procesam operētājsistēmā tiek nodrošināta viena unikāla failu deskriptoru tabula.



Failu tabulas ieraksts: Failu tabulas ieraksti ir atvērta faila surogāts atmiņā, kas tiek izveidots, apstrādājot pieprasījumu atvērt failu, un šie ieraksti saglabā faila pozīciju.

Failu tabulas ieraksts C

Standarta failu deskriptori : kad sākas kāds process, šī procesa failu deskriptoru tabulas fd(faila deskriptors) 0, 1, 2 tiek atvērtas automātiski, (pēc noklusējuma) katrs no šiem 3 fd atsauces uz failu tabulas ierakstu failam ar nosaukumu /dev/tty



/dev/tty : termināļa surogāts atmiņā.

Terminālis : kombinēta tastatūra/video ekrāns.

Standarta failu deskriptori

Lasīt no stdin => lasīt no fd 0 : Ikreiz, kad mēs rakstām jebkuru rakstzīmi no tastatūras, tā tiek nolasīta no stdin līdz fd 0 un tiek saglabāta failā ar nosaukumu /dev/tty.
Rakstiet uz stdout => rakstiet uz fd 1 : Ikreiz, kad video ekrānā redzam kādu izvadi, tā tiek iegūta no faila ar nosaukumu /dev/tty un tiek ierakstīta stdout ekrānā caur fd 1.
Rakstiet uz stderr => rakstiet uz fd 2 : Mēs redzam jebkuru kļūdu video ekrānā, tas ir arī no šī faila, kas tiek ierakstīts uz stderr ekrānā caur fd 2.

Ievades/izvades sistēmas zvani

Kopumā ir 5 I/O sistēmas izsaukumu veidi:

1. C izveidot

Funkciju create() izmanto, lai izveidotu jaunu tukšu failu programmā C. Mēs varam norādīt faila atļauju un nosaukumu, kuru vēlamies izveidot, izmantojot funkciju create(). Tas ir noteikts iekšpusē galvenes fails un karodziņi, kas tiek nodoti kā argumenti, ir definēti iekšpusē galvenes fails.

Create() sintakse valodā C

int   create  (char *  filename  , mode_t   mode  );>

Parametrs

  • faila nosaukums: faila nosaukumu, kuru vēlaties izveidot
  • režīms: norāda jaunā faila atļaujas.

Atdeves vērtība

  • atgriezt pirmo neizmantoto faila deskriptoru (parasti 3, kad pirmo reizi izveidojat lietojumu procesā, jo 0, 1, 2 fd ir rezervēti)
  • kļūdas gadījumā atgriezt -1

Kā C create() darbojas operētājsistēmā

  • Izveidojiet jaunu tukšu failu diskā.
  • Izveidojiet failu tabulas ierakstu.
  • Iestatiet pirmo neizmantoto faila deskriptoru, lai tas norādītu uz faila tabulas ierakstu.
  • Atgriezties faila deskriptors izmantots, -1, ja neveiksmes.

2. C atvērts

Funkcija open() programmā C tiek izmantota, lai atvērtu failu lasīšanai, rakstīšanai vai abiem. Tas var arī izveidot failu, ja tas neeksistē. Tas ir noteikts iekšpusē galvenes fails un karodziņi, kas tiek nodoti kā argumenti, ir definēti iekšpusē galvenes fails.

Open() sintakse valodā C

int   open   (const char*   Path  , int   flags  );>

Parametri

  • Ceļš: Ceļš uz failu, kuru vēlamies atvērt.
    • Izmantojiet absolūtais ceļš sākot ar / kad esat strādā tajā pašā direktorijā kā C avota fails.
    • Izmantot relatīvais ceļš kas ir tikai faila nosaukums ar paplašinājumu, kad esat strādā tajā pašā direktorijā kā C avota fails.
  • karogi: To izmanto, lai norādītu, kā vēlaties atvērt failu. Mēs varam izmantot šādus karogus.

Karogi

Apraksts

O_RDONLY Atver failu tikai lasīšanas režīmā.
O_WRONLY Atver failu tikai rakstīšanas režīmā.
O_RDWR Atver failu lasīšanas un rakstīšanas režīmā.
O_CREATE Izveidojiet failu, ja tas neeksistē.
O_EXCL Novērst izveidi, ja tā jau pastāv.
O_ PIEVIENOT Atver failu un novieto kursoru satura beigās.
O_ASYNC Iespējot ievades un izejas vadību ar signālu.
O_CLOEXEC Atvērtajā failā iespējojiet aizvēršanas-izpildīšanas režīmu.
O_NONBLOCK Atspējo atvērtā faila bloķēšanu.
O_TMPFILE Izveidojiet nenosauktu pagaidu failu norādītajā ceļā.

Kā C open() darbojas operētājsistēmā

  • Atrodiet diskā esošo failu.
  • Izveidojiet failu tabulas ierakstu.
  • Iestatiet pirmo neizmantoto faila deskriptoru, lai tas norādītu uz faila tabulas ierakstu.
  • Atgriezties faila deskriptors izmantots, -1, ja neveiksmes.

C open() piemērs

C




// C program to illustrate> // open system call> #include> #include> #include> #include> extern> int> errno>;> int> main()> {> >// if file does not have in directory> >// then file foo.txt is created.> >int> fd = open(>'foo.txt'>, O_RDONLY | O_CREAT);> >printf>(>'fd = %d '>, fd);> >if> (fd == -1) {> >// print which type of error have in a code> >printf>(>'Error Number % d '>,>errno>);> >// print program detail 'Success or failure'> >perror>(>'Program'>);> >}> >return> 0;> }>

>

>

Izvade

fd = 3>

3. C aizvērt

Funkcija close() programmā C norāda operētājsistēmai, ka esat pabeidzis ar faila deskriptoru, un aizver failu, uz kuru norāda faila deskriptors. Tas ir noteikts iekšpusē galvenes fails.

Aizvērt () sintakse valodā C

int close(int fd);>

Parametrs

  • fd: F ile deskriptors failam, kuru vēlaties aizvērt.

Atdeves vērtība

  • 0 par panākumiem.
  • -1 par kļūdu.

Kā C close() darbojas operētājsistēmā

  • Iznīcināt faila tabulas ierakstu, uz kuru atsaucas faila deskriptora tabulas elements fd
    – Kamēr uz to nenorāda neviens cits process!
  • Iestatiet failu deskriptora tabulas elementu fd uz NULL

1. piemērs: close() C

C




// C program to illustrate close system Call> #include> #include> #include> int> main()> {> >int> fd1 = open(>'foo.txt'>, O_RDONLY);> >if> (fd1 <0) {> >perror>(>'c1'>);> >exit>(1);> >}> >printf>(>'opened the fd = % d '>, fd1);> >// Using close system Call> >if> (close(fd1) <0) {> >perror>(>'c1'>);> >exit>(1);> >}> >printf>(>'closed the fd. '>);> }>

>

>

Izvade

opened the fd = 3 closed the fd.>

2. piemērs:

C




// C program to illustrate close system Call> #include> #include> int> main()> {> >// assume that foo.txt is already created> >int> fd1 = open(>'foo.txt'>, O_RDONLY, 0);> >close(fd1);> > >// assume that baz.tzt is already created> >int> fd2 = open(>'baz.txt'>, O_RDONLY, 0);> > >printf>(>'fd2 = % d '>, fd2);> >exit>(0);> }>

>

>

Izvade

fd2 = 3>

Šeit šajā kodā atgriežas vispirms open(). 3 jo, kad tiek izveidots galvenais process, tad fd 0, 1, 2 ir jau aizņemti stdin , stdout, un stderr . Tātad pirmais neizmantotais faila deskriptors ir 3 faila deskriptoru tabulā. Pēc tam in close() sistēmas zvans ir bezmaksas 3 failu deskriptorus un pēc tam iestatiet 3 failu deskriptori kā null . Tātad, kad mēs izsaucām otro open(), tad arī pirmais neizmantotais fd ir 3 . Tātad šīs programmas rezultāts ir 3 .

4. C lasīt

No faila, ko norāda faila deskriptors fd, funkcija read() nolasa norādīto baitu daudzumu cnt ievadi atmiņas apgabalā, ko norāda buf . Veiksmīga lasīšana () atjaunina faila piekļuves laiku. Funkcija read () ir definēta arī galvenes failā.

Read() sintakse valodā C

size_t   read   (int   fd  , void*   buf  , size_t   cnt  );>

Parametri

  • fd: faila deskriptors failam, no kura jānolasa dati.
  • buf: buferis datu nolasīšanai
  • cnt: bufera garums

Atdeves vērtība

  • return Nolasīto baitu skaits pēc panākumiem
  • atgriež 0, sasniedzot faila beigas
  • kļūdas gadījumā atgriezt -1
  • atgriešanās -1 signāla pārtraukumā

Svarīgi punkti

  • buf pārplūdes dēļ ir jānorāda uz derīgu atmiņas vietu, kuras garums nav mazāks par norādīto izmēru.
  • fd ir jābūt derīgam faila deskriptoram, kas atgriezts no open(), lai veiktu lasīšanas darbību, jo, ja fd ir NULL, lasīšanai vajadzētu radīt kļūdu.
  • cnt ir pieprasītais nolasīto baitu skaits, savukārt atgriešanas vērtība ir faktiskais nolasīto baitu skaits. Dažkārt arī lasīšanas sistēmas izsaukumam vajadzētu nolasīt mazāk baitu nekā cnt.

Read() piemērs valodā C

C




// C program to illustrate> // read system Call> #include> #include> #include> int> main()> {> >int> fd, sz;> >char>* c = (>char>*)>calloc>(100,>sizeof>(>char>));> >fd = open(>'foo.txt'>, O_RDONLY);> >if> (fd <0) {> >perror>(>'r1'>);> >exit>(1);> >}> >sz = read(fd, c, 10);> >printf>(>'called read(% d, c, 10). returned that'> >' %d bytes were read. '>,> >fd, sz);> >c[sz] =>' '>;> >printf>(>'Those bytes are as follows: % s '>, c);> >return> 0;> }>

>

>

Izvade

called read(3, c, 10). returned that 10 bytes were read. Those bytes are as follows: 0 0 0 foo.>

Pieņemsim, ka fails foobar.txt sastāv no 6 ASCII rakstzīmēm foobar. Kāda tad ir šādas programmas izvade?

C




// C program to illustrate> // read system Call> #include> #include> #include> #include> int> main()> {> >char> c;> >int> fd1 = open(>'sample.txt'>, O_RDONLY, 0);> >int> fd2 = open(>'sample.txt'>, O_RDONLY, 0);> >read(fd1, &c, 1);> >read(fd2, &c, 1);> >printf>(>'c = %c '>, c);> >exit>(0);> }>

>

>

Izvade

c = f>

Deskriptori fd1 un fd2 katram ir savs atvērtā faila tabulas ieraksts, tāpēc katram deskriptoram ir sava faila pozīcija foobar.txt . Tādējādi lasīt no fd2 nolasa pirmo baitu foobar.txt , un izvade ir c = f , nē c = o .

5. C rakstiet

Ieraksta cnt baitus no buf failā vai ligzdā, kas saistīta ar fd. cnt nedrīkst būt lielāks par INT_MAX (definēts limits.h galvenes failā). Ja cnt ir nulle, write() vienkārši atgriež 0, nemēģinot veikt citas darbības.

Rakstīt () ir arī definēts iekšpusē galvenes fails.

Rakstīšanas () sintakse C valodā

size_t   write   (int   fd  , void*   buf  , size_t   cnt  );>

Parametri

  • fd: faila deskriptors
  • buf: buferis, no kura rakstīt datus.
  • cnt: bufera garums.

Atdeves vērtība

  • atgriež baitu skaitu, kas uzrakstīts uz panākumiem.
  • atgriež 0, sasniedzot faila beigas.
  • kļūdas gadījumā atgriezt -1.
  • atgriešanās -1 uz signāla pārtraukumiem.

Svarīgi punkti par C rakstīšanu

  • Fails ir jāatver rakstīšanas darbībām
  • buf ir jābūt vismaz tik garam, cik norādīts cnt, jo, ja buf izmērs ir mazāks par cnt, buf novedīs pie pārpildes nosacījuma.
  • cnt ir pieprasītais ierakstāmo baitu skaits, savukārt atgriešanas vērtība ir faktiskais ierakstīto baitu skaits. Tas notiek, kad fd ir mazāks ierakstāmo baitu skaits nekā cnt.
  • Ja rakstīšana () tiek pārtraukta ar signālu, efekts ir viens no šiem:
    • Ja write() vēl nav ierakstījis nekādus datus, tas atgriež -1 un iestata errno uz EINTR.
    • Ja write() ir veiksmīgi ierakstījis dažus datus, tas atgriež baitu skaitu, ko tas uzrakstīja pirms tā pārtraukšanas.

Rakstīšanas () piemērs C valodā

C




// C program to illustrate> // write system Call> #include> #include> main()> {> int> sz;> int> fd = open(>'foo.txt'>, O_WRONLY | O_CREAT | O_TRUNC, 0644);> if> (fd <0)> {> >perror>(>'r1'>);> >exit>(1);> }> sz = write(fd,>'hello geeks '>,>strlen>(>'hello geeks '>));> printf>(>'called write(% d, 'hello geeks ', %d).'> >' It returned %d '>, fd,>strlen>(>'hello geeks '>), sz);> close(fd);> }>

sql izvēlieties no vairākām tabulām

>

>

Izvade

called write(3, 'hello geeks
', 12). it returned 11>

Šeit, kad pēc koda palaišanas failā foo.txt redzat, tiek parādīts a sveiki džeki . Ja failā foo.txt jau ir kāds saturs, tad rakstīšanas sistēmas izsaukumi pārraksta saturu un viss iepriekšējais saturs ir dzēsts un tikai sveiki džeki saturs būs failā.

Piemērs: izdrukājiet hello world no programmas, neizmantojot nekādu printf funkciju.

C




// C program to illustrate> // I/O system Calls> #include> #include> #include> #include> int> main(>void>)> {> >int> fd[2];> >char> buf1[12] =>'hello world'>;> >char> buf2[12];> >// assume foobar.txt is already created> >fd[0] = open(>'foobar.txt'>, O_RDWR);> >fd[1] = open(>'foobar.txt'>, O_RDWR);> >write(fd[0], buf1,>strlen>(buf1));> >write(1, buf2, read(fd[1], buf2, 12));> >close(fd[0]);> >close(fd[1]);> >return> 0;> }>

>

>

Izvade

hello world>

Šajā kodā buf1 masīva virkne Sveika pasaule vispirms tiek ierakstīta stdin fd[0], pēc tam šī virkne tiek ierakstīta stdin masīvā buf2. Pēc tam ierakstiet buf2 masīvā uz stdout un izdrukājiet izvadi Sveika pasaule .