Teknologian jakaminen

Korkean samanaikaisuuden reaktoripalvelin [keskikokoinen]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

4. Prosessin ohjaus ja prosessin synkronointi

1. Signaali

1.1 Signaalien peruskäsitteet

Signaali (signaali) on ohjelmistokeskeytys. Se on tapa lähettää viestejä prosessien välillä. Sitä käytetään ilmoittamaan prosessille tapahtumasta, mutta se ei voi välittää prosessille mitään.

On monia syitä, miksi signaaleja syntyy Shellissä, voit käyttääkilljakillallKomento lähettää signaali:

kill -信号的类型 进程编号
killall -信号的类型 进程名
  • 1
  • 2

1.2 Signaalityypit

signaalin nimisignaalin arvoOletuskäsittelytoimintoSignaalin syy
HUOKAA1APääte jumiutuu tai ohjausprosessi päättyy
SIGINT2ANäppäimistön keskeytys Ctrl+c
SIGQUIT3CNäppäimistön estonäppäintä painetaan
SIGILL4CLaiton ohje
SIGTRAP5Ckeskeytyskohdan ohjeet
SIGABRT6CKeskeytyssignaali, jonka on antanut abort(3)
SIGBUS7Cväylävirhe
SIGFPE8Cliukulukupoikkeus
SIGKILL9Akill -9 tappaa prosessin, tätä signaalia ei voida ottaa kiinni eikä jättää huomiotta
SIGUSR110AKäyttäjän määrittelemä signaali 1
SIGSEGV11CVirheellinen muistiviittaus (matriisi rajojen ulkopuolella, nollaosoittimen toiminta)
SIGUSR212AKäyttäjän määrittelemä signaali 2
SIGPIPE13AKirjoita tiedot putkeen ilman lukuprosessia
SIGALRM14AHerätyskellon signaali, signaali lähetetään hälytys()-toiminnolla
SIGTERM15APäätesignaali, oletusarvoisesti lähetetty signaali
SIGSTKFLT16Apinovirhe
SIGCHLD17BLähetetään, kun lapsiprosessi päättyy
SIGCONT18DJatka pysäytettyä prosessia
SIGSTOP19DPysäytä prosessi
SIGTSTP20DPääte paina stop-näppäintä
SIGTTIN21DTaustaprosessi pyytää terminaalin lukemista
SIGTTOU22DTaustaprosessi pyytää kirjoittamaan terminaaliin
SIGURG23BHätätilan tunnistus (pistorasiat)
SIGXCPU24CSuorittimen aikaraja ylitetty
SIGXFSZ25CTiedoston kokorajoitus ylitetty
SIGVTALRM26Avirtuaalisen kellon signaali
SIGPROF27AAnalysoi kellon signaaleja
SIGWINCH28BIkkunan koko muuttuu
SIGPOLL29BÄänestys (Sys V)
SIGPWR30Asähkökatkos
SIGSYS31CLaiton järjestelmäpuhelu

A:n oletustoiminto on lopettaa prosessi.

B:n oletustoiminto on jättää tämä signaali huomioimatta.

C:n oletustoiminto on lopettaa prosessi ja tehdä ytimen kuvavedos.

D:n oletustoiminto on pysäyttää prosessi, ja pysäytettyyn tilaan siirtyvä ohjelma voi jatkaa suorittamista.

1.3 Signaalinkäsittely

Prosesseilla on kolme tapaa käsitellä signaaleja:

  1. Järjestelmän oletustoimintoa käytetään tämän signaalin käsittelemiseen. Useimpien signaalien oletustoiminto on prosessin lopettaminen.
  2. Aseta keskeytyksen käsittelytoiminto Kun signaali on vastaanotettu, toiminto käsittelee sen.
  3. Ohita signaali äläkä tee signaalilla mitään, ikään kuin sitä ei koskaan olisi tapahtunut.

signal()Toiminnot voivat määrittää, miten ohjelma käsittelee signaaleja.

Toimintoilmoitus:

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • 1
  • 2
  • 3
  • 4

Parametrin kuvaus:

  • sig:Määritä siepattava signaali.
  • func : Osoitin signaalinkäsittelytoimintoon. Käsittelyfunktion on vastaanotettava kokonaislukuparametri, joka on siepatun signaalin numero.
  1. SIG_DFL :SIG_DFL-makro edustaa oletussignaalinkäsittelymenetelmää.käyttääSIG_DFLkutensignalToiminnon toinen parametri osoittaa, että signaalille käytetään järjestelmän oletuskäsittelymenetelmää.
  2. SIG_IGN :SIG_IGN-makro tarkoittaa signaalin huomioimista.käyttääSIG_IGNkutensignal Toiminnon toinen parametri osoittaa, että kun prosessi vastaanottaa signaalin, se jättää sen huomioimatta eikä suorita mitään käsittelyä. Tämä voi estää prosessien odottamattoman päätymisen tai keskeytymisen tietyissä olosuhteissa.
  3. SIG_ERR:SIG_ERR Makroja käytetään osoittamaan virheitä.se ei ole kuinsignalToiminnon toista parametria käytetään sen sijaan assignal Toiminnon palautusarvo osoittaa, että puhelu epäonnistui.jossignalJos funktion kutsu epäonnistuu, se palaaSIG_ERR .Tätä käytetään yleensä havaitsemiseen ja käsittelyynsignalVirhe toimintokutsussa.

kuva-20240709113614147

kuva-20240709113230874

kuva-20240709113240944

1.4 Mitä signaaleja käytetään?

Palveluohjelma toimii taustalla Jos sen halutaan pysäyttää, sen tappaminen ei ole hyvä idea, koska kun prosessi lopetetaan, se kuolee yhtäkkiä eikä jälkityötä järjestetä.

Jos lähetät signaalin palveluohjelmalle, palveluohjelma kutsuu signaalin vastaanotettuaan funktion ja kirjoittaa toimintoon jälkikoodin ja ohjelma voi poistua suunnitellusti.

Lähettämällä 0-signaalin palveluohjelmalle voidaan havaita, onko ohjelma elossa.

kuva-20240709135336848

1.5 Signaalien lähettäminen

Linux-käyttöjärjestelmä tarjoaa kill jakillall Komento lähettää ohjelmalle signaalin Ohjelmassa voit käyttääkill() Kirjastotoiminnot lähettävät signaaleja muille prosesseille.

Toimintoilmoitus:

int kill(pid_t pid, int sig);
  • 1

kill() Funktio ottaa parametritsig Määritetty signaali välitetään parametrillepid määritelty prosessi.

parametri pid On olemassa useita tilanteita:

  1. pid > 0 Välitä signaali prosessille muodossapid käsitellä asiaa.
  2. pid = 0 Välitä signaali kaikille prosesseille samassa prosessiryhmässä kuin nykyinen prosessi. Sitä käytetään usein lähettämään signaaleja aliprosessille.
  3. pid < -1 Välitä signaali prosessiryhmän ID:lle|pid| kaikista prosesseista.
  4. pid = -1 Välittää signaalin kaikille prosesseille, joilla on lupa lähettää signaali, mutta ei prosessille, joka lähetti signaalin.

2. Prosessin lopettaminen

Prosessin lopettamiseen on 8 tapaa, joista 5 on normaaleja lopetuksia, ne ovat:

  1. olla olemassa main() Toimintoja vartenreturn palata;
  2. Kutsutaan missä tahansa toiminnossa exit() toiminto;
  3. Kutsutaan missä tahansa toiminnossa _exit() tai_Exit() toiminto;
  4. Viimeinen säie alkaa käynnistysrutiinistaan ​​(säikeen päätoiminto) kanssa return palata;
  5. Soitettiin viimeisessä ketjussa pthread_exit() palata;

On kolme tapaa lopettaa epänormaalisti, ne ovat:

  1. siirtää abort() toiminto keskeyttää;
  2. Signaali vastaanotetaan;
  3. Viimeinen lanka vastaa peruutuspyyntöön.

2.1 Prosessin lopettamisen tila

olla olemassa main() Toiminnossa,return Palautettu arvo on lopetustila, jos eireturn lausunto tai soittoexit(), niin prosessin lopetustila on 0.

Tarkastele kuoressa prosessin lopettamisen tilaa:

echo $?
  • 1

3 toimintoa prosessin päättämiseksi normaalisti (exit() ja_Exit() on määritelty ISO C:ssä,_exit() on POSIX:n määrittelemä):

void exit(int status);
void _exit(int status);
void _Exit(int status);
  • 1
  • 2
  • 3

status Prosessin lopettamisen tila.

kuva-20240709143530327

kuva-20240709143615950

2.2 Resurssien julkaisuongelma

  • return Osoittaa, että kun funktio palaa, paikallisen objektin tuhoajaa kutsutaan.main() toiminnassareturn Globaalin objektin tuhoajaa kutsutaan myös.
  • exit() Ilmaisee prosessin lopettamisen, paikallisen objektin tuhoajaa ei kutsuta, vain globaalin objektin tuhoajaa kutsutaan.
  • _exit() ja_Exit() Poistu suoraan, eikä siivousta suoriteta.

2.3 Prosessin lopetustoiminto

Prosessi on käytettävissä atexit() Toimintojen rekisteröinti lopettaa toiminnot (32 asti), nämä toiminnot ovatexit() Soitetaan automaattisesti.

int atexit(void (*function)(void));
  • 1

exit() Lopetustoimintojen kutsun järjestys on käänteinen rekisteröintihetkestä lähtien.

kuva-20240709143824286

kuva-20240709143830549

3. Kutsu suoritettava ohjelma

3.1 system()-funktio

system()Funktio tarjoaa yksinkertaisen menetelmän ohjelman suorittamiseen välittäen ohjelman ja suoritettavat parametrit merkkijonona.system()Pelkkää toimintaa.

Toimintoilmoitus:

int system(const char * string);
  • 1

system()Toiminnon palautusarvo on hankalampi.

  1. Jos suoritettua ohjelmaa ei ole olemassa,system()Funktio palauttaa nollasta poikkeavan;
  2. Jos ohjelman suoritus onnistuu ja suoritetun ohjelman suoritustila on 0,system()Funktio palauttaa 0;
  3. Jos ohjelman suoritus onnistuu ja suoritetun ohjelman lopetustila ei ole 0,system()Funktio palauttaa nollasta poikkeavan.

3.2 exec-toimintoperhe

execFunktioperheet tarjoavat toisen tavan kutsua ohjelmia (binäärejä tai komentosarjoja) prosessin sisällä.

execToimintoperhe ilmoitetaan seuraavasti:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Ilmoitus

  1. Jos ohjelman suoritus epäonnistuu, palautetaan suoraan -1 ja epäonnistumisen syy tallennetaanerrnokeskellä.
  2. Uuden prosessin prosessinumero on sama kuin alkuperäisen prosessin, mutta uusi prosessi korvaa alkuperäisen prosessin koodisegmentin, datasegmentin ja pinon.
  3. Jos suoritus onnistuu, toiminto ei palaa onnistuneesti pääohjelmassaexecTämän jälkeen kutsuttu ohjelma korvaa kutsuvan ohjelman, eliexecEi koodia toiminnon suorittamisen jälkeen.
  4. Varsinaisessa kehityksessä yleisimmin käytetty onexecl()jaexecv(), muita käytetään harvoin.

4. Luo prosessi

4.1 Linux-prosessit 0, 1 ja 2

Kaikki prosessit koko Linux-järjestelmässä ovat puurakenteessa.

  • **Prosessi nro 0 (järjestelmäprosessi)** on kaikkien prosessien esi-isä. Se loi prosessit nro 1 ja 2.
  • **Prosessi nro 1 (systemd)** vastaa ytimen alustuksen ja järjestelmän konfiguroinnin suorittamisesta.
  • **Prosessi nro 2 (kthreadd)** vastaa kaikkien ytimen säikeiden ajoituksesta ja hallinnasta.

käyttääpstreeVoit tarkastella prosessipuuta komennolla:

pstree -p 进程编号
  • 1

4.2 Prosessin tunnistaminen

Jokaisella prosessilla on yksilöllinen prosessitunnus, jota edustaa ei-negatiivinen kokonaisluku. Vaikka prosessitunnukset ovat ainutlaatuisia, niitä voidaan käyttää uudelleen. Kun prosessi päättyy, sen prosessitunnuksesta tulee ehdokas uudelleenkäyttöön. Linux käyttää viivästettyä uudelleenkäyttöalgoritmia, jotta juuri luodun prosessin tunnus eroaa äskettäin lopetetun prosessin käyttämästä ID:stä. Tämä estää sitä, että uusia prosesseja erehtyisivät erehtymään samaa tunnusta käyttäviksi lopetetuiksi prosesseiksi.

Toiminto prosessitunnuksen saamiseksi:

pid_t getpid(void);    // 获取当前进程的ID。
pid_t getppid(void);   // 获取父进程的ID。
  • 1
  • 2

4.3 fork()-funktio

Olemassa oleva prosessi voi kutsuafork()Toiminto luo uuden prosessin.

Toimintoilmoitus:

pid_t fork(void);
  • 1

Riippuafork()Luotua uutta prosessia kutsutaan lapsiprosessiksi.

fork() Funktiota kutsutaan kerran, mutta se palaa kahdesti. Ero näiden kahden palautuksen välillä on, että aliprosessin palautusarvo on 0, kun taas pääprosessin palautusarvo on juuri luodun aliprosessin prosessitunnus.

Lapsiprosessi ja emoprosessi jatkuvatfork()Koodi sen jälkeen, Aliprosessi on kopio pääprosessista. Aliprosessilla on kopio ylätason prosessin tietotilasta, keosta ja pinosta (huomaa: aliprosessi omistaa kopion, ei jaeta pääprosessin kanssa).

fork()Sen jälkeen ylä- ja alatason prosessien suoritusjärjestys on määrittelemätön.

kuva-20240709221535371

kuva-20240709221546617

4.4 Fork() kaksi käyttötapaa

  1. Pääprosessi haluaa kopioida itsensä, ja sitten pääprosessi ja lapsiprosessi suorittavat kumpikin eri koodin.Tämä käyttö on hyvin yleistä verkkopalveluohjelmissa. Pääprosessi odottaa asiakkaan yhteyspyyntöä, kun pyyntö saapuufork(), anna aliprosessin käsitellä nämä pyynnöt, kun taas pääprosessi odottaa seuraavaa yhteyspyyntöä.
  2. Prosessi haluaa suorittaa toisen ohjelman.Tämä käyttö on hyvin yleistä kuorissa, lapsiprosessi alkaafork()Soitettiin heti paluun jälkeenexec

4.5 Jaetut tiedostot

fork()Yksi ominaisuus on, että pääprosessissa avatut tiedostokuvaukset kopioidaan aliprosessiin, ja pääprosessilla ja aliprosessilla on sama tiedostosiirtymä.

Jos pääprosessi ja aliprosessi kirjoittavat saman kuvaajan osoittamaan tiedostoon ilman minkäänlaista synkronointia, niiden tulosteet voivat sekoittua keskenään.

kuva-20240709222929369

kuva-20240709222803641

Tässä vaiheessa näet, että tietoja on vain 100 000 riviä.

kuva-20240709222853769

kuva-20240709223236254

Tällä hetkellä dataa pitäisi olla 200 000 riviä vähemmän, koska tiedoston kirjoitustoiminto ei ole atomi. Synkronointimekanismin puuttuessa kaksi prosessia voi yrittää kirjoittaa tiedoston eri osia samanaikaisesti kirjoitus epäonnistuu.

4.6 vfork()-funktio

vfork()Toimintokutsut ja palautusarvot ovat samat kuinfork()Sama, mutta niiden semantiikka on erilainen.

vfork()Funktiolla luodaan uusi prosessi, jonka tarkoitus onexecUusi ohjelma, joka ei kopioi pääprosessin osoiteavaruutta, koska aliprosessi kutsuu välittömästiexec , joten pääprosessin osoiteavaruutta ei käytetä. Jos aliprosessi käyttää emoprosessin osoiteavaruutta, voi ilmetä tuntemattomia tuloksia.

vfork()jafork()Toinen ero on:vfork()Varmista, että aliprosessi suoritetaan ensin, ja kutsu se aliprosessissaexectaiexitSen jälkeen emoprosessi jatkaa toimintaansa.

5. Zombie-prosessi

Käyttöjärjestelmässä zombie-prosessi viittaa aliprosessiin, joka on päättynyt, mutta sen pääprosessi ei ole vielä lukenut poistumistilaa. Vaikka zombie-prosessi ei ole enää käynnissä, sillä on silti merkintä prosessitaulukossa, jotta ydin voi tallentaa prosessin poistumistilatiedot (kuten prosessin tunnuksen, poistumistilan jne.), kunnes pääprosessi lukee nämä tiedot.

5.1 Zombie-prosessien syyt

Jos pääprosessi poistuu ennen aliprosessia, aliprosessia isännöi prosessi 1 (tämä on myös tapa antaa prosessin suorittaa taustalla).

Jos aliprosessi poistuu ennen emoprosessia, eikä pääprosessi käsittele aliprosessin poistumistietoja, aliprosessista tulee zombieprosessi.

5.2 Zombie-prosessien haitat

Ydin säilyttää tietorakenteen jokaiselle aliprosessille, mukaan lukien prosessin numero, lopetustila, käytetty CPU-aika jne. Jos pääprosessi käsittelee aliprosessin poistumistiedot, ydin vapauttaa tämän tietorakenteen. Jos pääprosessi ei käsittele aliprosessin poistumistietoja, ydin ei vapauta tätä tietorakennetta ja aliprosessin prosessinumero on aina varattu. Järjestelmässä käytettävissä olevat prosessimäärät ovat rajalliset. Jos zombie-prosesseja syntyy suuri määrä, järjestelmä ei pysty generoimaan uusia prosesseja, koska käytettävissä ei ole prosessinumeroita.

5.3 Menetelmät zombi-prosessien välttämiseksi

  1. SIGCHLD-signaalin käsittely : Kun aliprosessi poistuu, ydin lähettää SIGCHLD-signaalin pääprosessille.Jos emoprosessi käyttääsignal(SIGCHLD, SIG_IGN)Ilmoita ytimelle, että se ei ole kiinnostunut lapsiprosessin poistumisesta, ja sen tietorakenne vapautetaan heti aliprosessin poistuttua.
  2. käyttääwait()/waitpid()toiminto: Pääprosessi odottaa aliprosessin päättymistä kutsumalla näitä toimintoja ja saa sen poistumistilan vapauttaen siten aliprosessin käyttämät resurssit.
pid_t wait(int *stat_loc); 
pid_t waitpid(pid_t pid, int *stat_loc, int options); 
pid_t wait3(int *status, int options, struct rusage *rusage); 
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
  • 1
  • 2
  • 3
  • 4

Palautusarvo on aliprosessin numero.

stat_loc Onko tiedot lapsiprosessin lopettamisesta:

a) Jos lopetetaan normaalisti, makro WIFEXITED(stat_loc) Palaa tosi, makroWEXITSTATUS(stat_loc) Irtisanomisen tila voidaan saada;

b) Jos se päättyy epänormaalisti, makro WTERMSIG(stat_loc) Saa signaalin prosessin lopettamiseksi.

kuva-20240709230911352

kuva-20240709231034423

kuva-20240709231050581

kuva-20240709231124375

kuva-20240709231140813

Jos vanhempi prosessi on varattu, voit kaapata SIGCHLD Signaali, kutsutaan signaalinkäsittelytoiminnossawait()/waitpid()

kuva-20240709231439475

kuva-20240709231422927

6. Useita prosesseja ja signaaleja

[Lähetä signaaleja prosessien välillä](##1.5 Lähetä signaaleja)

Moniprosessipalveluohjelmassa, jos aliprosessi vastaanottaa poistumissignaalin, aliprosessi poistuu itsestään.

Jos pääprosessi vastaanottaa poistumissignaalin, sen tulee lähettää poistumissignaalit kaikille lapsiprosesseille ja sitten poistua itse.

kuva-20240711222919564

kuva-20240711222900141

kuva-20240711223111481

7. Jaettu muisti

Monisäikeet jakavat prosessin osoiteavaruuden,Jos useiden säikeiden on käytettävä samaa muistia, käytä vain yleisiä muuttujia.

Useissa prosesseissa kunkin prosessin osoiteavaruus on itsenäinen eikä jaettu.Jos useiden prosessien on käytettävä samaa muistia, globaaleja muuttujia ei voida käyttää, vain jaettua muistia voidaan käyttää.

Jaettu muisti sallii useiden prosessien pääsyn samaan muistitilaan (prosessien välillä ei vaadita verisuhdetta). Se on tehokkain tapa jakaa ja siirtää tietoja useiden prosessien välillä. Prosessit voivat yhdistää jaetun muistin omaan osoiteavaruuteensa. Jos yksi prosessi muuttaa jaetussa muistissa olevia tietoja, myös muiden prosessien lukemat tiedot muuttuvat.

Jaettu muisti ei tarjoa lukitusmekanismia, eli kun prosessi lukee/kirjoittaa jaettua muistia, se ei estä muita prosesseja lukemasta/kirjoittamasta sitä.Jos haluat lukita jaetun muistin luku-/kirjoitustoiminnon, voit käyttää semaforia . Linux tarjoaa joukon toimintoja jaetun muistin käyttöä varten.

7.1 shmget-toiminto

Tätä toimintoa käytetään jaetun muistin luomiseen/hankimiseen.

 int shmget(key_t key, size_t size, int shmflg);
  • 1
  • avain Jaetun muistin avainarvo on kokonaisluku (typedef unsigned int key_t), yleensä esimerkiksi heksadesimaalimuodossa 0x5005, eri yhteisten muistojen avaimet eivät voi olla samat.
  • koko Jaetun muistin koko tavuina.
  • shmflg Jaetun muistin käyttöoikeudet ovat samat kuin esimerkiksi tiedostojen käyttöoikeudet0666|IPC_CREAT Ilmaisee, että jos jaettua muistia ei ole, luo se.
  • palautusarvo: Palauttaa jaetun muistin tunnuksen (kokonaisluku, joka on suurempi kuin 0) onnistuessa, -1 epäonnistuessa (järjestelmässä ei ole tarpeeksi muistia eikä käyttöoikeuksia).

kuva-20240711224223200

kuva-20240711224212293

käyttää ipcs -m Voit tarkastella järjestelmän jaettua muistia, mukaan lukien: avain, jaetun muistin tunnus (shmid), omistaja, käyttöoikeudet (perms) ja koko (tavuja).

käyttää ipcrm -m 共享内存id Jaettu muisti voidaan poistaa manuaalisesti seuraavasti:

kuva-20240711225202860

Huomautus: Säilöjä ei voi käyttää jaetun muistin tietotyypeille, vain perustietotyyppejä voidaan käyttää.

7.2 shmat-toiminto

Tätä toimintoa käytetään yhdistämään jaettu muisti nykyisen prosessin osoiteavaruuteen.

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 1
  • shmid Riippuashmget() Toiminnon palauttama jaetun muistin tunniste.
  • shmaddr Määritä osoitepaikka, jossa jaettu muisti on kytketty nykyiseen prosessiin. Täytä yleensä 0, jotta järjestelmä voi valita jaetun muistin osoitteen.
  • shmflg Lippupala, yleensä täytetty 0:lla.

Palauttaa jaetun muistin aloitusosoitteen, kun puhelu on onnistunut, ja palauttaa, kun se epäonnistuu. (void *)-1

7.3 shmdt-toiminto

Tätä toimintoa käytetään irrottamaan jaettu muisti nykyisestä prosessista, joka vastaa shmat() Funktion käänteinen toiminta.

int shmdt(const void *shmaddr);
  • 1
  • shmaddr shmat() Toiminnon palauttama osoite.

Palauttaa 0, jos puhelu onnistuu ja -1, jos se epäonnistuu.

7.4 shmctl-toiminto

Tätä toimintoa käytetään jaetun muistin käyttämiseen. Yleisin toiminto on jaetun muistin poistaminen.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • shmid shmget() Toiminnon palauttama jaetun muistin tunnus.
  • komento Ohjeet jaetun muistin käyttämiseen Jos haluat poistaa jaetun muistin, täytäIPC_RMID
  • buf Jaettua muistia käyttävän tietorakenteen osoite Jos haluat poistaa jaetun muistin, täytä 0.

Palauttaa 0, jos puhelu onnistuu ja -1, jos se epäonnistuu.

Huomaa, käytä root Tavalliset käyttäjät eivät voi poistaa luotua jaettua muistia luoduista käyttöoikeuksista huolimatta.

kuva-20240711230653886

kuva-20240711230522921

7.5 Pyöreä jono

7.6 Jaettuun muistiin perustuva pyöreä jono

Palauttaa 0, jos puhelu onnistuu ja -1, jos se epäonnistuu.

7.4 shmctl-toiminto

Tätä toimintoa käytetään jaetun muistin käyttämiseen. Yleisin toiminto on jaetun muistin poistaminen.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • shmid shmget() Toiminnon palauttama jaetun muistin tunnus.
  • komento Ohjeet jaetun muistin käyttämiseen Jos haluat poistaa jaetun muistin, täytäIPC_RMID
  • buf Jaettua muistia käyttävän tietorakenteen osoite Jos haluat poistaa jaetun muistin, täytä 0.

Palauttaa 0, jos puhelu onnistuu ja -1, jos se epäonnistuu.

Huomaa, käytä root Tavalliset käyttäjät eivät voi poistaa luotua jaettua muistia luoduista käyttöoikeuksista huolimatta.

[Ulkoisten linkkien kuvia siirretään...(img-v6qW3XRA-1720711279572)]

[Ulkoisten linkkien kuvia siirretään...(img-CG0tGAne-1720711279572)]Ulkoisen linkin kuvan siirto epäonnistui. Lähdesivustolla voi olla ikääntymisen estomekanismi. On suositeltavaa tallentaa kuva ja ladata se suoraan.
Ulkoisen linkin kuvan siirto epäonnistui. Lähdesivustolla voi olla ikääntymisen estomekanismi. On suositeltavaa tallentaa kuva ja ladata se suoraan.
Ulkoisen linkin kuvan siirto epäonnistui. Lähdesivustolla voi olla ikääntymisen estomekanismi. On suositeltavaa tallentaa kuva ja ladata se suoraan.

7.5 Pyöreä jono

7.6 Jaettuun muistiin perustuva pyöreä jono