Bhukha “Linux API. Umhlahlandlela ophelele"


Bhukha “Linux API. Umhlahlandlela ophelele"

Sawubona Ngethula ukunaka kwakho incwadi ethi “Linux API. Umhlahlandlela ophelele" (ukuhunyushwa kwencwadi I-Linux Programming Interface). Inga-odwa kuwebhusayithi yomshicileli, futhi uma usebenzisa ikhodi yephromoshini LinuxAPI , uzothola isaphulelo esingu-30%.

Ingcaphuno evela encwadini ukuze ibhekisele:

Amasokhethi: I-Server Architecture

Kulesi sahluko, sizoxoxa ngezisekelo zokuklama amaseva aphindaphindayo nahambisanayo, futhi sibheke nedaemon ekhethekile ebizwa nge-inetd, eyenza kube lula ukudala izinhlelo zokusebenza zeseva ye-inthanethi.

Amaseva aphindaphindayo nahambisanayo

Kunezakhiwo ezimbili ezivamile zeseva yenethiwekhi esekwe isokhethi:

  • iterative: iseva isebenzela amaklayenti esisodwa ngesikhathi, iqale icubungule isicelo (noma izicelo ezimbalwa) kusuka kuklayenti elilodwa bese idlulela kwelinye;

  • parallel: iseva yakhelwe ukusiza amaklayenti amaningi kanyekanye.

Isibonelo seseva ephindaphindayo esisekelwe kolayini be-FIFO bese sivele siphrezentwa kuSigaba 44.8.

Amaseva aphindaphindayo ngokuvamile afaneleka kuphela ezimeni lapho izicelo zeklayenti zingacutshungulwa ngokushesha, njengoba iklayenti ngalinye liphoqeleka ukuthi lilinde kuze kube yilapho noma yimaphi amanye amakhasimende enikezwe. Icala elijwayelekile lokusebenzisa le ndlela ukushintshana kwezicelo kanye nezimpendulo phakathi kweklayenti neseva.

Amaseva afanayo afaneleka ezimeni lapho isicelo ngasinye sithatha inani elibalulekile lesikhathi ukuze sicutshungulwe, noma lapho iklayenti neseva zihlanganyela ekushintshaneni komlayezo omude. Kulesi sahluko, sizogxila kakhulu endleleni evamile (nelula) yokuklama amaseva afanayo, okuwukudala inqubo yengane ehlukile yeklayenti ngalinye elisha. Le nqubo yenza wonke umsebenzi wokusebenzela iklayenti bese iyaphela. Ngenxa yokuthi ngayinye yalezi zinqubo isebenza ngokuzimela, kungenzeka ukuhlinzeka amaklayenti amaningi ngesikhathi esisodwa. Umsebenzi oyinhloko wenqubo yeseva eyinhloko (umzali) ukudala ingane ehlukile kuklayenti ngalinye elisha (okungenjalo, imicu yokubulawa ingadalwa esikhundleni sezinqubo).

Ezigabeni ezilandelayo, sizobheka izibonelo zamaseva amasokhethi wesizinda se-inthanethi aphindaphindayo nahambisanayo. Lezi ziphakeli ezimbili zisebenzisa inguqulo eyenziwe lula yesevisi ye-echo (RFC 862), ebuyisela ikhophi yanoma yimuphi umlayezo othunyelwe kuyo yiklayenti.

I-echo yeseva ye-UDP ephindaphindayo

Kulesi sigaba nesilandelayo sizokwethula amaseva esevisi ye-echo. Itholakala kunombolo yembobo 7 futhi isebenza ngaphezu kwakho kokubili kwe-UDP ne-TCP (lesi sizinda sigodliwe, ngakho-ke iseva ye-echo kufanele isetshenziswe ngamalungelo omlawuli).

Iseva ye-echo UDP ifunda ngokuqhubekayo ama-datagram futhi ibuyisela amakhophi awo kumthumeli. Njengoba iseva idinga kuphela ukucubungula umlayezo owodwa ngesikhathi, i-architecture ephindaphindayo izokwanela. Ifayela elingasekhanda leziphakeli liboniswa ohlwini lwama-56.1.

Uhlu 56.1. Ifayela elingunhlokweni lezinhlelo id_echo_sv.c kanye ne-id_echo_cl.c

#ihlanganisa "inet_sockets.h" /* Imemezela imisebenzi yesokhethi yethu */
#faka phakathi "tlpi_hdr.h"

#define SERVICE "echo" /* Igama lesevisi ye-UDP */

#chaza BUF_SIZE 500 /* Ubukhulu bosayizi wamadathagram lawo
ingafundwa iklayenti neseva */
____________________________________________________________________________________amasokhethi/id_echo.h

Uhlu 56.2 lubonisa ukuqaliswa kweseva. Amaphuzu alandelayo afanele ukuqashelwa:

  • ukufaka iseva kumodi ye-daemon, sisebenzisa umsebenzi we- becomeDaemon() kusukela kusigaba 37.2;

  • ukwenza uhlelo luhlangane kakhudlwana, sisebenzisa umtapo wolwazi ukuze sisebenze nezisekelo zesizinda se-inthanethi, esakhiwe esigabeni 55.12;

  • uma iseva ingakwazi ukubuyisela impendulo kuklayenti, ibhala umlayezo kulogi isebenzisa i-syslog() call.

Kuhlelo lokusebenza lwangempela, kungenzeka sibeke umkhawulo othile ekuvameni kwemilayezo yokungena kusetshenziswa i-syslog(). Lokhu kuzosusa amathuba okuthi umhlaseli agcwale ilogu yesistimu. Ngaphezu kwalokho, ungakhohlwa ukuthi ucingo ngalunye oluya ku-syslog() lubiza kakhulu, njengoba lisebenzisa i-fsync() ngokuzenzakalelayo.

Uhlu 56.2. Iseva yokuphindaphinda esebenzisa isevisi ye-UDP echo

________________________________________________________________________________amasokhethi/id_echo_sv.c
#faka
#faka phakathi "id_echo.h"
#faka phakathi "ibe_daemon.h"

Int
main(int argc, char *argv[])
{
int sfd;
usayizi_t inomboloRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

uma (ibeDaemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(ISEVICE, SOCK_DGRAM, NULL);
uma (sfd == -1) {
syslog(LOG_ERR, "Ayikwazanga ukudala isokhethi leseva (%s)",
i-strerror (errno));
phuma(EXIT_FAILURE);

/* Thola ama-datagram bese ubuyisela amakhophi awo kubathumeli */
}
okwe (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

uma (inomboloFunda == -1)
errExit("recvfrom");
uma (thumela ku(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Iphutha linanela impendulo ku-%s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
i-strerror (errno));
}
}
________________________________________________________________________________amasokhethi/id_echo_sv.c

Ukuhlola ukusebenza kweseva, sisebenzisa uhlelo olusuka kuhlu 56.3. Iphinde isebenzise umtapo wolwazi ekusebenzeni namasokhethi esizinda se-inthanethi, ethuthukiswe esigabeni 55.12. Njengempikiswano yokuqala yomugqa womyalo, uhlelo lweklayenti luthatha igama lenodi yenethiwekhi lapho iseva itholakala khona. Iklayenti lifaka iluphu lapho lithumela khona impikiswano ngayinye esele kuseva njengama-datagram ahlukene, bese lifunda futhi liphrinte ama-datagram eliwatholayo kuseva liphendula.

Uhlu 56.3. Iklayenti lesevisi ye-UDP echo

#faka phakathi "id_echo.h"

Int
main(int argc, char *argv[])
{
int sfd, j;
usayizi_t len;
usayizi_t inomboloRead;
char buf[BUF_SIZE];

uma (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s host msg…n", argv[0]);

/* Yakha ikheli leseva ngokusekelwe kungxabano yomugqa womyalo wokuqala */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
uma (sfd == -1)
fatal("Ayikwazanga ukuxhuma kusokhethi leseva");

/* Thumela izimpikiswano ezisele kuseva ngendlela yama-datagram ahlukene */
okwe (j = 2; j < argc; j++) {
len = strlen(argv[j]);
uma (bhala(sfd, argv[j], len) != len)
fatal("ingxenye/yehlulekile ukubhala");

numRead = funda(sfd, buf, BUF_SIZE);
uma (inomboloFunda == -1)
errExit("funda");
printf("[%ld bytes] %.*sn", (inde) numRead, (int) numRead, buf);
}
phuma(EXIT_SUCCESS);
}
________________________________________________________________________________amasokhethi/id_echo_cl.c

Ngezansi isibonelo salokho esizokubona lapho sisebenzisa iseva nezimo ezimbili zamaklayenti:

$su // Amalungelo ayadingeka ukuze ubophezele embobeni egodliwe
Iphasiwedi:
# ./id_echo_sv // Iseva iya kumodi yangemuva
# phuma // Yeka amalungelo omlawuli
$ ./id_echo_cl localhost sawubona mhlaba // Leli klayenti lithumela ama-datagram amabili
[5 bytes] sawubona // Iklayenti libonisa impendulo etholwe kuseva
[amabhayithi ama-5] umhlaba
$ ./id_echo_cl localhost goodbye // Leli klayenti lithumela idathagram eyodwa
[7 bytes] usale kahle

Ngikufisela ukufunda okujabulisayo)

Source: linux.org.ru