Buke “Linux API. alakai piha"


Buke “Linux API. alakai piha"

Aloha awakea, Aloha Auinalā Ke hōʻike aku nei au iā ʻoe i ka puke "Linux API. He alakaʻi piha" (unuhi o ka puke ʻO ka Linux Programming Interface). Hiki ke kauoha ʻia ma ka pūnaewele o ka mea hoʻopuka, a inā ʻoe e hoʻohana i ke code hoʻolaha LinuxAPI , e loaʻa iā ʻoe kahi hoʻemi 30%.

Wehe mai ka puke no ka ʻike:

Nā Pūnaehana: Kūlana Kūlana

Ma kēia mokuna, e kūkākūkā mākou i nā kumu o ka hoʻolālā ʻana i nā kikowaena iterative a me ka like, a e nānā pū i kahi daemon kūikawā i kapa ʻia ʻo inetd, kahi e maʻalahi ai ka hana ʻana i nā noi kikowaena pūnaewele.

Nā kikowaena hoʻololi a me ka like

ʻElua mau papa hana kikowaena pūnaewele maʻamau.

  • hoʻololi: lawelawe ke kikowaena i nā mea kūʻai aku i kēlā me kēia manawa, e hana mua i kahi noi (a i ʻole kekahi mau noi) mai kekahi mea kūʻai aku a laila neʻe i kahi aʻe;

  • parallel: ua hoʻolālā ʻia ke kikowaena e lawelawe i nā mea kūʻai aku i ka manawa like.

Ua hōʻike mua ʻia kahi hiʻohiʻona o kahi kikowaena iterative e pili ana i nā queues FIFO ma ka Pauku 44.8.

He kūpono wale nō nā kikowaena Iterative i nā kūlana kahi e hiki ai ke hoʻokō koke ʻia nā noi o nā mea kūʻai aku, no ka mea e koi ʻia kēlā me kēia mea kūʻai aku e kali a lawelawe ʻia nā mea kūʻai aku ma mua. ʻO kahi hihia hoʻohana maʻamau no kēia ala ʻo ka hoʻololi ʻana i nā noi hoʻokahi a me nā pane ma waena o kahi mea kūʻai aku a me kahi kikowaena.

Ua kūpono nā kikowaena Parallel i nā hihia kahi e nui ai ka manawa o kēlā me kēia noi e hana ai, a i ʻole kahi e komo ai ka mea kūʻai aku a me ke kikowaena i nā hoʻololi memo lōʻihi. Ma kēia mokuna, e kālele nui mākou i ke ala kuʻuna (a maʻalahi loa) o ka hoʻolālā ʻana i nā kikowaena like, ʻo ia hoʻi ka hana ʻana i kahi kaʻina keiki kaʻawale no kēlā me kēia mea kūʻai aku. Hana kēia hana i nā hana a pau e lawelawe i ka mea kūʻai aku a laila hoʻopau. Ma muli o ka hana kūʻokoʻa o kēlā me kēia kaʻina hana, hiki ke lawelawe i nā mea kūʻai aku he nui i ka manawa like. ʻO ka hana nui o ke kaʻina kikowaena nui (makua) ʻo ia ka hana ʻana i kahi keiki kaʻawale no kēlā me kēia mea kūʻai hou (ʻo ia hoʻi, hiki ke hana ʻia nā kaula o ka hoʻokō ma mua o nā kaʻina hana).

Ma nā ʻāpana aʻe, e nānā mākou i nā hiʻohiʻona o ka iterative a me ka parallel pūnaewele pūnaewele socket servers. Hoʻokomo kēia mau kikowaena ʻelua i kahi mana maʻalahi o ka lawelawe echo (RFC 862), e hoʻihoʻi i kahi kope o nā leka i hoʻouna ʻia e ka mea kūʻai aku.

ʻO ke kani ʻana o ke kikowaena UDP

Ma kēia a me ka ʻāpana aʻe e hoʻolauna mākou i nā kikowaena no ka lawelawe echo. Loaʻa ia ma ka helu awa 7 a hana ma luna o ka UDP a me TCP (ua mālama ʻia kēia awa, a no laila pono e holo ka server echo me nā kuleana luna).

Heluhelu mau ke kikowaena UDP echo i nā datagrams a hoʻihoʻi i nā kope o ia mau mea i ka mea hoʻouna. No ka mea e pono ana ke kikowaena e hoʻoponopono i hoʻokahi memo i ka manawa, e lawa ana ka hoʻolālā iterative. Hōʻike ʻia ka faila poʻomanaʻo no nā kikowaena ma ka papa inoa 56.1.

Papa inoa 56.1. Waihona poʻomanaʻo no nā polokalamu id_echo_sv.c a me id_echo_cl.c

#include "inet_sockets.h" /* Hōʻike i nā hana o kā mākou kumu */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* inoa lawelawe UDP */

#define BUF_SIZE 500 /* Ka nui kiʻekiʻe o nā kiʻi ʻikepili
hiki ke heluhelu ʻia e ka mea kūʻai aku a me ke kikowaena */
_____________________________________________________________________sockets/id_echo.h

Hōʻike ka papa inoa 56.2 i ka hoʻokō kikowaena. Pono e hoʻomaopopo i kēia mau mea:

  • e hoʻokomo i ke kikowaena i ke ʻano daemon, hoʻohana mākou i ka hana becomeDaemon() mai ka pauku 37.2;

  • no ka hoʻomāhuahua ʻana i ka papahana, hoʻohana mākou i ka waihona no ka hana ʻana me nā kumu kikowaena pūnaewele, i kūkulu ʻia ma ka pauku 55.12;

  • inā ʻaʻole hiki i ke kikowaena ke hoʻihoʻi i kahi pane i ka mea kūʻai aku, kākau ia i kahi leka i ka log me ka hoʻohana ʻana i ka syslog() kelepona.

Ma kahi noi maoli, e kau paha mākou i kekahi palena i ka alapine o ka hoʻopaʻa ʻana i nā leka me ka syslog(). E hoʻopau kēia i ka hiki ʻana o kahi mea hoʻouka kaua e hoʻopiha i ka log system. Eia kekahi, mai poina i kēlā me kēia kelepona i ka syslog() he kumukūʻai nui, no ka mea, hoʻohana ʻo ia i ka fsync() ma ke ʻano maʻamau.

Papa inoa 56.2. Hoʻohana ʻia ka server e hoʻokō i ka lawelawe echo UDP

_________________________________________________________________sockets/id_echo_sv.c
#hoʻokomo
#include "id_echo.h"
#include "become_daemon.h"

INT
nui(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

inā (e lilo ʻoDaemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
inā (sfd == -1) {
syslog(LOG_ERR, "ʻAʻole hiki ke hana i ke kumu kikowaena (%s)",
strerror(errno));
puka (EXIT_FAILURE);

/* Loaʻa i nā datagrams a hoʻihoʻi i nā kope o ia mau mea i nā mea hoʻouna */
}
no (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

inā (numRead == -1)
errExit("recvmai");
inā (hoʻouna (sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!= heluRead)
syslog(LOG_WARNING, "Hāhewa ke kani ʻana i ka pane iā %s (%s)",
inetAddressStr((struct sockaddr *) & claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c

No ka hoʻāʻo ʻana i ka hana a ke kikowaena, hoʻohana mākou i ka papahana mai Listing 56.3. Hoʻohana pū ia i ka waihona no ka hana ʻana me nā kumu kikowaena pūnaewele, i kūkulu ʻia ma ka pauku 55.12. E like me ka hoʻopaʻapaʻa laina kauoha mua, lawe ka polokalamu mea kūʻai aku i ka inoa o ka node pūnaewele kahi i loaʻa ai ke kikowaena. Hoʻokomo ka mea kūʻai i kahi loop kahi e hoʻouna ai i kēlā me kēia o nā manaʻo i koe i ke kikowaena ma ke ʻano he datagrams kaʻawale, a laila heluhelu a paʻi i nā datagrams i loaʻa iā ia mai ke kikowaena ma ka pane.

Papa inoa 56.3. Mea kūʻai no ka lawelawe leo UDP

#include "id_echo.h"

INT
nui(int argc, char *argv[])
{
int sfd, j;
nui_t len;
ssize_t numRead;
char buf[BUF_SIZE];

inā (argc <2 || strcmp(argv[1], "--kōkua") == 0)
usageErr("%s host msg…n", argv[0]);

/* Hoʻokumu i ka helu kikowaena ma muli o ka hoʻopaʻapaʻa laina kauoha mua */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
inā (sfd == -1)
fatal("ʻAʻole hiki ke hoʻopili i ke kumu kikowaena");

/* E hoʻouna i nā manaʻo i koe i ke kikowaena ma ke ʻano o nā datagrams kaʻawale */
no (j = 2; j < argc; j++) {
len = strlen(argv[j]);
inā (kākau(sfd, argv[j], len) != len)
fatal("ʻāpana / hāʻule kākau");

numRead = heluhelu(sfd, buf, BUF_SIZE);
inā (numRead == -1)
errExit("heluhelu");
printf("[%ld bytes] %.*sn", (lōʻihi) numRead, (int) numRead, buf);
}
puka(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Aia ma lalo kahi hiʻohiʻona o ka mea a mākou e ʻike ai i ka wā e holo ana i ka server a me ʻelua mau mea kūʻai aku:

$su // Pono nā pono e hoʻopaʻa i kahi awa i mālama ʻia
Hua huna:
# ./id_echo_sv // Hele ke kikowaena i ke ʻano kāʻei kua
# puka // Hāʻawi i nā kuleana luna
$ ./id_echo_cl localhost hello world // Hoʻouna kēia mea kūʻai aku i ʻelua datagrams
[5 bytes] aloha // Hōʻike ka mea kūʻai aku i ka pane i loaʻa mai ke kikowaena
[5 bytes] honua
$ ./id_echo_cl localhost goodbye // Hoʻouna kēia mea kūʻai aku i hoʻokahi datagram
[7 bytes] aloha

Makemake wau iā ʻoe i kahi heluhelu ʻoluʻolu)

Source: linux.org.ru