C standard library :: stropts

getmsg - modtag næste message fra en STREAM fil

[XSR] [Option Start]int getmsg (int fd, struct strbuf *ctlptr, struct strbuf *dataptr, int *flagsp)[Option End]

Denne funktion modtager indholdet af en message forrest på STREAM head læse køen associeret med en STREAM fil og placerer indholdet i en eller flere buffere. Message indeholder enten en data-del, kontrol-del eller begge. Data- og kontrol-delen af en message skal placeres i seperate buffere, som beskrevet nedenstående. Betydningen af hver del er defineret i skaberen af en message.

Funktionen getpmsg() er magen til getmsg(), bortset fra at den giver bedre kontrol over prioriteter af messages der modtages. Undtaget hvor det nævnt er alle beskrivelser for getmsg() også gældende for getpmsg().

Parameteren fd angiver en file descriptor der refererer til en STREAM-baseret fil.

Parameterne ctlptr og dataptr peger hver til en strbuf struktur, i hvilken buf medlemmet peger til en buffer hvor data- og kontrol-informationer placeres, maxlen medlemmet afspejler antallet af byte en buffer kan rumme. Ved return, vil len medlemmet indeholde antallet af bytes af data- eller kontrol-informationer faktisk modtaget. Medlemmet len skal sættes til 0 hvis der er en nul-længde kontrol- eller data-del og len skal sættes til -1 hvis ingen data- eller kontrol-informationer er tilstede i message.

Når getmsg() kaldes, skal flagsp pege på en int som indikerer typen af message som processen er i stand til at modtage. Beskrevet yderligt nedenfor.

Parameteren ctlptr bliver anvendt til at placere kontrol-delen af en message og dataptr er anvendt til at placere data-delen af en message. Hvis ctlptr eller dataptr er en null peger eller maxlen medlemmet er -1, vil kontrol- eller data-delen af en message ikke blive behandlet og vil blive ladt tilbage på STREAM head læse køen, og hvis ctlptr eller dataptr ikke er en null peger, skal len sættes til -1. Hvis maxlen medlemmet er sat til 0 og der er en nul-længde kontrol- eller data-del, skal den nul-længde del fjernes fra læse køen og len skal sættes til 0. Hvis maxlen medlemmet er ctlptr eller dataptr er mindre en kontrol- eller data-delen og en message skal maxlen bytes modtages. I dette tilfælde vil den resterende del af message efterlades på STREAM head læse køen og en ikke-nul returværdi skal gives.

Som standard, skal getmsg() behandle den først tilgængelige message på STREAM head læse køen. Dog kan en process vælge at modtage kun højt prioriterede messages ved at sætte en int udpeget af flagsp til RS_HIPRI. I det tilfælde skal getmsg() kun behandle den næste message hvis det er en højt prioriteret message. Når en int udpeget af flagsp er 0 vil enhver tilgængelig message modtages. I sådant et tilfælde vil den int udpeget af flagsp blive sat til RS_HIPRI hvis det var en højt prioriteret message der blev modtaget, ellers 0.

For getpmsg() er der forskel på flag. Parameteren flagsp peget på en bitmaske med følgende gensidigt-udelukkelses flag defineret: MSG_HIPRI, MSG_BAND og MSG_ANY. Som getmsg(), skal getpmsg() behandle den første tilgængelige message på STREAM head læse køen. En process kan vælge at modtage kun højt-prioriterede messages ved at sætte en int udpeget af flagsp til MSG_HIPRI og en int udpeget af bandp til 0. I sådant et tilfælde skal getpmsg() kun behandle den næste message hvis det er et høj-prioriteret message. På lignende måde kan en process vælge at modtage en message fra et bestemt prioritets band ved at sætte int udpeget af flagsp til MSG_BAND og int udpeget af bandp til det prioritetsband af interesse. I sådant tilfælde, vil getpmsg() kun behandle den næste message hvis den er i et prioritetsband lig med eller større end det indikeret i int udpeget af bandp, eller hvis det er en høj-prioriteret message. Hvis en process ønsker at få den første message af køen, skal den int udpeget af flagsp sættes til MSG_ANY og int udpeget af bandp sættes til 0. På retur, hvis den message blev modtaget var en høj-prioriteret message, bliver den int udpeget at flagsp sat til MSG_HIPRI og den int udpeget af bandp sat til 0. Ellers vil den int udpeget af flagsp blive sat til MSG_BAND og den int udpeget af bandp blive sat til det prioritetsband angivet i message.

Hvis O_NONBLOCK ikke er sat, skal getmsg() og getpmsg() blokere indtil en message med typen specificeret af flagsp er tilgængelig i front af STREAM head læse køen. Hvis O_NONBLOCK er sat og en message med den type angivet af flagsp ikke er tilgængelig i front af STREAM head læse køen, vil getmsg() og getpmsg() fejle og errno sættes til [EAGAIN].

Hvis en afbrydelse optræder på en STREAM fra hvilken messages hentes, skal getmsg() og getpmsg() fortsætte med at operere normalt som beskrevet ovenfor, indtil STREAM head læse køen er tom. Derefter, skal de returnere 0 i len medlemmet i ctlptr og dataptr.

Return værdi

Ved succes i udførelsen, skal getmsg() og getpmsg() returnere en positiv værdi. En værdi på 0 indikerer at en hel message blev læst. En returværdi på MORECTL indikerer at flere kontrol-informationer venter på at blive hentet. En retur værdi på MOREDATA indikerer at flere data-informationer venter på at blive hentet. En returværdi med en bitvis-logisk OR af MORECTL og MOREDATA fortæller at der er flere kontrol- og data-informationer ventende. Efterfølgende kald til getmsg() og getpmsg() vil hente det resterende af en message. Dog hvis en høj-prioriteret message er kommet ind i STREAM head læse køen, vil det næste kald til getmsg() eller getpmsg() hente den højere prioriterede message før den henter en resterende del af en message.

Hvis den høj-prioriterede kontrol-del af en message er forbrugt, skal message placeres tilbage i køen som en normal message med band 0. Efterfølgende getmsg() og getpmsg() kald skal hente den resterende del af en message. Dog, hvis en prioriteret message ankommer eller allerede eksisterer på STREAM head, skal efterfølgende kald til getmsg() eller getpmsg() modtage den højere prioriterede message før end modtagelsen af den resterende del af en message der er puttet tilbage.

Ved fejl, skal getmsg() og getpmsg() returnere -1 og errno sættes til indikation af fejlen.

Fejl

Funktionen getmsg() og getpmsg() skal fejle hvis:

[EAGAIN]
Flaget O_NONBLOCK er sat og ingen message var tilgængelig.
[EBADF]
Parameter fd er ikke valid file descriptor åben for læsning.
[EBADMSG]
Den message i køen er ikke valid for getmsg() eller getpmsg() eller en ventende file descriptor er i STREAM head.
[EINTR]
Et signal blev indfanget gennem getmsg() eller getpmsg().
[EINVAL]
En illegal værdi var angivet af flagsp eller den STREAM eller multiplexer refereret af fd er kædet (direkte eller indirekte) downstream fra en multiplexer.
[ENOSTR]
En STREAM er ikke associeret med fd.

I tillæg, vil getmsg() og getpmsg() fejle hvis STREAM head har behandlet en asynkron fejl før et kald. I sådant tilfælde vil værdien af errno ikke reflektere resultater af getmsg() eller getpmsg(), men reflektere den forrige fejl.

Ressourcer C Library opslag The Single UNIX® Specification, Version 2 Copyright © 1997 The Open Group GNU C Library Engelsk, med masser af gode og dybe artikler. Danske søgeord Find selv de bedste danske søgeord til din hjemmeside.
Produkter Bookingsystem
System for reservation af tid for behandlinger, aftaler, lokaler, udstyr, personale. Tilpasset lektionstimer. Udskriver arbejdsplaner og ugeskema for opslag. Statistik. Danmarks bedste pris nu kun kr. 1.695,-
HelpdeskEffektiviser din support-organisation med et Helpdesksystem. Fjern tidrøvere der forhindrer fokus på problemløsning. Lektionsplan Formidling af generelle information og specifikke lektioner fra undervisere til studerende/elever. Medlemssystem Medlemssystem online med administration af medlemskartotek, kontingentbetalinger, flettefiler m.m.
Styr selv Styr selv indholdet på dine hjemmesider med Content Management System.
Citat Samvittighed er en svigermor, hvis besøg aldrig hører op.

H. L. Mencken



Professionelle løsninger til Internettet. Webdesign, e-handel, cms, søgeoptimering, webhotel, analyse, Intranet mm.