C Programmēšana

POSIX koplietotā atmiņa ar C programmēšanu

POSIX koplietotā atmiņa ar C programmēšanu
POSIX dalītā atmiņa ir starpprocesu komunikācijas (IPC) ietvars, kas norādīts POSIX specifikācijās. Divu (vai vairāk) uzdevumu var nolasīt no tā un rakstīt koplietotās atmiņas zonā, vienlaikus izveidojot kopīgo atmiņu. POSIX dalītā atmiņa ne vienmēr nodrošina kopiju izmaksu atšķirībā no citām IPC struktūrām (piem.,.g., caurule, kontaktligzda utt.), un tas ir vēlams noteiktām programmām.

POSIX koplietotās atmiņas zvani

POSIX koplietotās atmiņas funkcijas koncentrējās uz UNIX koncepciju, ka objektam jābūt dokumentam, veicot ievades / izvades darbības entītijā. Tāpēc, tā kā jūs lasāt un ierakstāt abpusēju POSIX atmiņas entītiju, tā jāuzskata par dokumentu. Atmiņā kartēts dokuments ir POSIX koplietojamās atmiņas entītija. Lai izmantotu shm_open sistēmas izsaukuma funkcija zemāk / dev / shm, tiek ģenerēti atsevišķi koplietojamās atmiņas dokumenti. Ir tikai divi īpaši koplietotās atmiņas sistēmas zvani no POSIX, shm_open, un shm_unlink, kas ir cieši saistīti ar failu sistēmas zvanu atvēršanu un atsaistīšanu. The ftruncate, mmap, un munmap ietvara izsaukumi uz dokumentiem tiek izmantoti citu uzdevumu veikšanai POSIX koplietotajā atmiņā. Ir nepieciešams savienot programmu, kurā tiek izmantoti POSIX koplietotās atmiņas zvani -lrt.

Programmām, kas izmanto POSIX koplietotās atmiņas zvanus, jāveic šādas darbības:

Izmantojot shm_open (), veidot koplietojamas atmiņas objektu. Dokumenta deskriptoru var atcelt, ja objekta izveidošana ir veiksmīga.

Ar saīsināt (), objekta izmērs tiks fiksēts.

Ar karte () un MAP_SHARED, norobežojiet šo objektu pašreizējā adrešu telpā.

Lasīt / rakstīt koplietojamo atmiņu.

Caur munmap (), atdaliet koplietojamo atmiņu.

Izmantot aizvērt () lai aizvērtu objektu.

Caur shm_unlink (), izdzēsiet objektu koplietotajā atmiņā.

shm_open ()

Kā aprakstīts iepriekš, shm_open () tiek izmantots jauna koplietotās atmiņas objekta ģenerēšanai. Tas padara objektu pieejamu izsaukšanas procedūrai, izmantojot atgriezto deskriptoru. Šī funkcijas izsaukuma definīcija ir šāda:

>> Int shm_open (const char * name, int oflag, mode_t mode);

Pirmais parametrs ir koplietotās atmiņas objekta nosaukums. Tā ir nulles izbeigta virkne / nosaukums tips, ar nosacījumu, ka neviens cits raksturs nevar būt slīpsvītra, izņemot tā pirmo rakstzīmi. Oflag ir mazs plīvurs, kas izveidots ar vairākiem iepriekšējiem karodziņiem, izmantojot OR-vai nu caur O_RDONLY vai O_RDWR. Aprakstītie parametri norāda, ka tā koplietotās atmiņas objekts ir jāveido (O_CREAT), ja tas vēl nepastāv un objekts ir pieejams arī lasīšanai un rakstīšanai (O_RDWR). Pats pēdējais arguments nosaka direktoriju apstiprinājumus koplietotās atmiņas objektam.

shm_unlink ()

Shm_unlink () novērš iepriekš izveidoto POSIX koplietojamās atmiņas entītiju. Koplietotās atmiņas objekta vesels skaitļa dokumenta deskriptors tiek atgriezts, efektīvi izsaucot uz shm_open (). Kā noteikts zem shm_open (), parametra nosaukums ir koplietotās atmiņas entītijas nosaukums. Tālāk ir definēts shm_unlink () funkcija:

>> Int shm_unlink (const char * nosaukums);

saīsināt ()

Iestatot objektu, saīsināt () metode tiek atcelta, lai iestatītu entītijas lielumu baitos. Funkcijas definīcija ir šāda:

>> Int ftruncate (int fd, off_t garums);

Veidojot kopīgu POSIX atmiņu, tās lieluma ietilpība patiešām ir nulle baitu. Jūs varat renderēt POSIX koplietotās atmiņas entītiju ar lieluma garuma baitiem, izmantojot saīsināt. Saīsināt pēc izpildes dod nulli. Saīsināt izejas -1 neveiksmes gadījumā un errno ir iestatīts, lai aktivizētu kļūdu.

mmap ()

Galu galā atmiņā kartētais dokuments ar koplietotās atmiņas entītiju tiek iestatīts, izmantojot mmap () metodi. Pēc tam tiek iegūts atmiņā kartēts dokumenta rādītājs, kas tiek izmests, lai sasniegtu koplietotās atmiņas entītiju. Tālāk ir definēts mmap () funkcija:

>> Void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

Šajā gadījumā “addr” ir adrese, uz kuru tā tiks kartēta. “Garums” ir koplietotās atmiņas entītijas diapazons. Prot vērtības var atšķirties, taču mēs izmantosim PROT READ | PAREIZI RAKSTIET. Ir vairāki karodziņi, taču MAP SHARED ir būtiska kopīgotajā atmiņā. Tagad 'fd' ir dokumentu iegūšanas elements, kas iegūts agrāk. Nobīde ir vieta, kur kartēšana sākas koplietotās atmiņas entītijā; var izmantot arī 0 nobīdes vērtību. Pēc pabeigšanas, mmap () novirza rādītāju uz koplietotās atmiņas entītijas kartēšanas pozīciju.

munmap ()

Pozīcijā, ko vada adrese, un iegūstot izmēru, garumu, munmap atceļ koplietotās atmiņas vienumu. Munmap iegūst 0 pēc pabeigšanas un -1 neprecizitātes situācijā, tādā gadījumā kļūdas iedarbināšanai tiek piešķirts errno.

>> Void munmap (anulēts * addr, size_t garums);

Piemērs: sūtītājs un saņēmējs

Ņemsim sūtītāja un saņēmēja piemēru. Sūtītājs izveidos jaunu koplietotās atmiņas objektu ar nosaukumu / shmem-piemērs un caur to kopīgajā atmiņā ierakstiet trīs ciparus. Tagad uztvērējs var atklāt koplietotās atmiņas objektu un no atmiņas skaitīt trīs ciparus. Mēs izveidosim trīs failus ar nosaukumiem protokols.h, sūtītājs.c, un uztvērējs.c.

$ touch protokols.h
$ touch sūtītājs.c
$ touch uztvērējs.c

Pēc tam failu protokolam pievienosim tālāk norādīto pirmkodu.h "sūtītājs.c, 'un' uztvērējs.c."Tagad mēs visus saglabāsim un aizvērsim.

Tagad mēs apkoposim un pievienosimies iepriekšējam kodam, izmantojot sūtītājam atsevišķi atslēgvārdu -lrt.c un uztvērējs.c fails. Šeit ir komanda to darīt:

$ gcc -o sūtītāja sūtītājs.c -lrt
$ gcc -o uztvērēja uztvērējs.c -lrt

Tagad mēs palaidīsim sūtītāja kodu, izmantojot šādu komandu. Rezultāts ir norādīts zemāk.

$ ./ sūtītājs

Palaidot sūtītāja kodu, ir izveidots koplietotās atmiņas objekts, kuru var atrast zemāk / dev / shm izmantojot zemāk esošo komandu:

$ ls -l / dev / shm | grep shmem-piemērs

Palaidot uztvērēja kodu, mēs iegūsim šādu izvadi:

$ ./ uztvērējs

Kad vien funkcija gm_unlink () tiek saukts, izmantojot failu uztvērēju.c, 'objekts / dev / shm / shmem-piemērs tiks atdalīts. Šajā gadījumā uz izejas netiks iegūts neviens objekts, kā parādīts zemāk.

$ ls -l / dev / shm / shmem-piemērs

Secinājums

Šajā rakstā jūs uzzinājāt, kā Ubuntu 20 izmantot POSIX koplietojamo atmiņu ar C programmēšanu.04, ieskaitot katru funkciju izsaukumu, ko izmanto koplietotās atmiņas izveidošanai. Es ceru, ka šis raksts jums palīdzēja uzlabot zināšanas par programmēšanu un aptvēra visas šaubas, kas jums ir par šo tēmu.

OpenTTD apmācība
OpenTTD ir viena no populārākajām biznesa simulācijas spēlēm. Šajā spēlē jums ir jāizveido brīnišķīgs transporta bizness. Tomēr jūs sāksit sākumā apmē...
SuperTuxKart operētājsistēmai Linux
SuperTuxKart ir lielisks nosaukums, kas paredzēts, lai sniegtu jums Mario Kart pieredzi bez maksas jūsu Linux sistēmā. Tas ir diezgan izaicinoši un ja...
Cīņa par Vesnota apmācību
Cīņa par Vesnotu ir viena no populārākajām atvērtā koda stratēģijas spēlēm, kuru jūs varat spēlēt šajā laikā. Šī spēle ir izstrādāta ne tikai ļoti ilg...