Librum “Linux API. Comprehensive Guide"


Librum “Linux API. Comprehensive Guide"

Bona dies Librum tuum “Linux API” animo tuo praebeo. Dux comprehensive" (libri translatio Linux Programming Interface). Ordinari potest in loco editoris, et si applicas codicem promo LinuxAPI , accipies 30% discount.

Excerpta ex libro pro reference:

Bases: Servo Architecture

In hoc capite, fundamenta tractabimus de ministrantibus Iterativa et parallela designandi, ac etiam specialem daemonem qui inetd vocatur, quo facilius efficiat applicationes servo Internet.

Iterativa et parallela servers

Duae sunt communes nervum substructio retiacula architecturae servientis:

  • iterativus: clientibus singillatim servit, primum petitionem (vel plures petitiones) dispensando ab uno cliente ac deinde in proximum;

  • parallel: in servis pluribus simul clientibus servire destinatur.

Exemplum iterativae servientis in FIFO queues in Art 44.8 iam praesentatum erat.

Servientes iterativi soliti sunt tantum idonei in condicionibus ubi petitiones clientium satis cito discursum esse possunt, cum unusquisque clientis expectare cogatur donec alii clientes in conspectu eius appositi sunt. Usus communis casus ad hanc accessionem est commutatio postulationum et responsionum singularium inter clientem et ministrum.

Ministri paralleli idonei sunt in casibus ubi unaquaeque petitio notabile temporis ad processum sumit, vel ubi client et ministra longas commutationes nuntius exercent. In hoc capite maxime intendunt modum traditionalis (et simplicissimae) designandi servitores parallelos, qui separatum puerum processum creare pro quolibet cliente novo. Hic processus omne opus serviendi clienti praestat ac deinde finit. Quia uterque horum processuum independenter operatur, pluribus clientibus simul servire potest. Praecipuum munus principalis processus servo (parentis) est creare pro unoquoque novo cliente separatum puerum (vel: fila exsecutionis loco processuum creari possunt).

In sectionibus sequentibus, exempla iterativae et parallelae nervum servientium interrete domain spectabimus. Hi duo servientes faciliorem reddunt versionem muneris echo (RFC 862), quae exemplum reddit cuiuslibet nuntii missi a cliente.

Iterative UDP servo resonare

In hac et in sequenti sectione ministratores ad resonare ministerium inducemus. Praesto est in numero portuum 7 et opera super utrumque UDP et TCP (hic portus reservatus est, et ideo servo echo currendum est cum privilegiis administratorum).

Echo UDP server continenter datagrammata legit et exemplares earum mittenti reddit. Cum servo tantum opus est ut unum nuntium ad tempus procedamus, architectura iterativa sufficiet. Fasciculus capitalis pro ministris in Listing 56.1 ostenditur.

varius 56.1. Fasciculus Header ad programmata id_echo_sv.c et id_echo_cl.c

#include "inet_sockets.h" /* Declarat functiones tabernaculi nostri */
#include "tlpi_hdr.h"

#define SERVITIUM "resonare" /* UDP ministerium nomen */

#define BUF_SIZE D / * magnitudinem maximam datagrams that
potest legi per clientem et servo * /
______________________________________________________ sockets/id_echo.h

56.2 Enumeratio servo exsecutionem ostendit. Sequentia notanda sunt:

  • ministratorem in modum daemonis imponere, munus ex sectione 37.2;

  • ut programmata magis compacta efficiat, bibliotheca ad operandum cum basibus interretialibus domain, in sectione 55.12 evoluta est;

  • si server responsionem clienti reddere non potest, epistulam scribit in syslog utens () vocationem.

In applicatione reali, aliquem modum imponere verisimiliter in crebritate nuntiis colligationis syslog(). Hoc possibilitatem impugnantis exuberantem systematis stipes tolleret. Praeter haec, noli oblivisci quod uterque vocatus ad syslog() satis carus est, quia per defaltam fsync() utitur.

varius 56.2. Iteratio servo UDP resonare opera conficiens

______________________________________________________ sockets/id_echo_sv.c
#includere
#include "id_echo.h"
#include "become_daemon.h"

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

if (becomeDaemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVITIUM, SOCK_DGRAM, NULL);
si (sfd == -1) {
syslog (LOG_ERR, "servum nervum creare non potuit",
strerror(errno));
exitus(EXIT_FAILURE);

/* Accipe datagrams et exempla eorum mitte mittentibus */
}
nam (;;) {
len = sizeof(sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

si (numRead == -1)
errExit("recvfrom");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr*) &claddr, len)
!= numRead)
syslog (LOG_WARNING, "Error resonans cum %s(%s)",
inetAddressStr((struct sockaddr*) &claddr, len,
addrStr, IS_ADDR_STR_LEN);
strerror(errno));
}
}
______________________________________________________ sockets/id_echo_sv.c

Ad probandam operationem servi, programmata ab Enumeratione utimur 56.3. Etiam bibliotheca utitur ad operandum cum bases interretiali domain, in sectione 55.12 evoluta. Cum primum mandatum lineae argumentum, client progressio nomen accipit nodi retis in quo server sita est. Cliens fasciam intrat ubi singulas rationes servo ut singulas datagrammata mittat, et dein legit et imprimat datagrammata quae accipit a servo in responsione.

varius 56.3. Clientem ad UDP resonare ministerium

#include "id_echo.h"

int
main(int argc, char * argv[])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];

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

/ * Forma servo electronica secundum primum mandatum linea ratio * /
sfd = inetConnect(argv[1], SERVITIUM, SOCK_DGRAM);
si (sfd == -1)
exitiale ("Nonne iungo ut servo nervum");

/ * Reliquas rationes mitte servo in forma separatum datagrams * /
pro (j = 2; j < argc; j++) {
len = strlen(argv[j]);
si (scribe(sfd, argv[j], len) != len)
exitiale ("partial/defecit scribe");

numRead = lege(sfd, buf, BUF_SIZE);
si (numRead == -1)
errExit("legere");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
exitus (EXIT_SUCCESS);
}
______________________________________________________ sockets/id_echo_cl.c

Infra exemplum videbimus cum servo currenti et duobus clientibus instantiae:

$su // Privilegia obligare ad portum reservatum requiruntur
Password:
# ./id_echo_sv // Servo modus in background abit
# Exit // da iura administrator
$ ./id_echo_cl localhost salve mundi // Hic client mittit duo datagrams
[5 bytes] salve // ​​Cliens responsum ostendit a servo receptum
[5 bytes] world
Hic cliens mittit unum datagram . $ ./id_echo_cl localhost vale //
[7 bytes] vale

Lectio iucundum tibi opto)

Source: linux.org.ru