ืกืคืจ "Linux API. ืžื“ืจื™ืš ืžืงื™ืฃ"


ืกืคืจ "Linux API. ืžื“ืจื™ืš ืžืงื™ืฃ"

ืื—ืจ ื”ืฆื”ืจื™ื™ื ื˜ื•ื‘ื™ื ืื ื™ ืžืฆื™ื’ ืœืชืฉื•ืžืช ืœื‘ื›ื ืืช ื”ืกืคืจ "Linux API. ืžื“ืจื™ืš ืžืงื™ืฃ" (ืชืจื’ื•ื ื”ืกืคืจ ืžืžืฉืง ื”ืชื›ื ื•ืช ืฉืœ ืœื™ื ื•ืงืก). ื ื™ืชืŸ ืœื”ื–ืžื™ืŸ ืื•ืชื• ื‘ืืชืจ ื”ืื™ื ื˜ืจื ื˜ ืฉืœ ื”ืžื•ืฆื™ื ืœืื•ืจ, ื•ืื ืืชื” ืžื—ื™ืœ ืืช ืฉื•ื‘ืจ ื”ืคืจืกื•ื LinuxAPI , ืชืงื‘ืœ ื”ื ื—ื” ืฉืœ 30%.

ืงื˜ืข ืžื”ืกืคืจ ืœืขื™ื•ืŸ:

ืฉืงืขื™ื: ืืจื›ื™ื˜ืงื˜ื•ืจืช ืฉืจืช

ื‘ืคืจืง ื–ื”, ื ื“ื•ืŸ ื‘ื™ืกื•ื“ื•ืช ืฉืœ ืขื™ืฆื•ื‘ ืฉืจืชื™ื ืื™ื˜ืจื˜ื™ื‘ื™ื™ื ื•ืžืงื‘ื™ืœื™ื, ื•ื›ืŸ ื ืกืชื›ืœ ืขืœ ื“ืžื•ืŸ ืžื™ื•ื—ื“ ื‘ืฉื inetd, ื”ืžืงืœ ืขืœ ื™ืฆื™ืจืช ื™ื™ืฉื•ืžื™ ืฉืจืช ืื™ื ื˜ืจื ื˜.

ืฉืจืชื™ื ืื™ื˜ืจื˜ื™ื‘ื™ื™ื ื•ืžืงื‘ื™ืœื™ื

ื™ืฉื ืŸ ืฉืชื™ ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืฉืจืช ืจืฉืช ื ืคื•ืฆื•ืช ืžื‘ื•ืกืกื•ืช ืฉืงืขื™ื:

  • ืื™ื˜ืจื˜ื™ื‘ื™: ื”ืฉืจืช ืžืฉืจืช ืœืงื•ื—ื•ืช ืื—ื“ ื‘ื›ืœ ืคืขื, ืชื—ื™ืœื” ืžืขื‘ื“ ื‘ืงืฉื” (ืื• ืžืกืคืจ ื‘ืงืฉื•ืช) ืžืœืงื•ื— ืื—ื“ ื•ืื– ืขื•ื‘ืจ ืœืžืฉื ื”ื•;

  • ืžืงื‘ื™ืœ: ื”ืฉืจืช ืžื™ื•ืขื“ ืœืฉืจืช ืžืกืคืจ ืœืงื•ื—ื•ืช ื‘ื• ื–ืžื ื™ืช.

ื“ื•ื’ืžื” ืœืฉืจืช ืื™ื˜ืจื˜ื™ื‘ื™ ื”ืžื‘ื•ืกืก ืขืœ ืชื•ืจื™ FIFO ื›ื‘ืจ ื”ื•ืฆื’ื” ื‘ืกืขื™ืฃ 44.8.

ืฉืจืชื™ื ืื™ื˜ืจื˜ื™ื‘ื™ื™ื ืžืชืื™ืžื™ื ื‘ื“ืจืš ื›ืœืœ ืจืง ื‘ืžืฆื‘ื™ื ืฉื‘ื”ื ื ื™ืชืŸ ืœืขื‘ื“ ื‘ืงืฉื•ืช ืœืงื•ื— ื“ื™ ืžื”ืจ, ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ืœืงื•ื— ื ืืœืฅ ืœื”ืžืชื™ืŸ ืขื“ ืฉื›ืœ ืœืงื•ื— ืื—ืจ ืžื•ืœื• ื™ื•ื’ืฉ. ืžืงืจื” ืฉื™ืžื•ืฉ ื ืคื•ืฅ ืœื’ื™ืฉื” ื–ื• ื”ื•ื ื”ื—ืœืคืช ื‘ืงืฉื•ืช ื•ืชื’ื•ื‘ื•ืช ื‘ื•ื“ื“ื•ืช ื‘ื™ืŸ ืœืงื•ื— ืœืฉืจืช.

ืฉืจืชื™ื ืžืงื‘ื™ืœื™ื ืžืชืื™ืžื™ื ื‘ืžืงืจื™ื ื‘ื”ื ื›ืœ ื‘ืงืฉื” ืœื•ืงื—ืช ืคืจืง ื–ืžืŸ ืžืฉืžืขื•ืชื™ ืœืขื™ื‘ื•ื“, ืื• ื›ืืฉืจ ื”ืœืงื•ื— ื•ื”ืฉืจืช ืขื•ืกืงื™ื ื‘ื—ื™ืœื•ืคื™ ื”ื•ื“ืขื•ืช ืืจื•ื›ื•ืช. ื‘ืคืจืง ื–ื” ื ืชืžืงื“ ื‘ืขื™ืงืจ ื‘ื“ืจืš ื”ืžืกื•ืจืชื™ืช (ื•ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ) ืฉืœ ืขื™ืฆื•ื‘ ืฉืจืชื™ื ืžืงื‘ื™ืœื™ื, ืฉื”ื™ื ื™ืฆื™ืจืช ืชื”ืœื™ืš ื™ืœื“ ื ืคืจื“ ืขื‘ื•ืจ ื›ืœ ืœืงื•ื— ื—ื“ืฉ. ืชื”ืœื™ืš ื–ื” ืžื‘ืฆืข ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ื›ื“ื™ ืœืฉืจืช ืืช ื”ืœืงื•ื— ื•ืœืื—ืจ ืžื›ืŸ ืžืกืชื™ื™ื. ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ืื—ื“ ืžื”ืชื”ืœื™ื›ื™ื ื”ืœืœื• ืคื•ืขืœ ื‘ืื•ืคืŸ ืขืฆืžืื™, ื ื™ืชืŸ ืœืฉืจืช ืžืกืคืจ ืœืงื•ื—ื•ืช ื‘ื• ื–ืžื ื™ืช. ื”ืžืฉื™ืžื” ื”ืขื™ืงืจื™ืช ืฉืœ ืชื”ืœื™ืš ื”ืฉืจืช ื”ืจืืฉื™ (ื”ื•ืจื”) ื”ื™ื ืœื™ืฆื•ืจ ื™ืœื“ ื ืคืจื“ ืขื‘ื•ืจ ื›ืœ ืœืงื•ื— ื—ื“ืฉ (ืœื—ืœื•ืคื™ืŸ, ื ื™ืชืŸ ืœื™ืฆื•ืจ ืคืชื™ืœื™ื ืฉืœ ื‘ื™ืฆื•ืข ื‘ืžืงื•ื ืชื”ืœื™ื›ื™ื).

ื‘ืกืขื™ืคื™ื ื”ื‘ืื™ื, ื ื‘ื—ืŸ ื“ื•ื’ืžืื•ืช ืฉืœ ืฉืจืชื™ ืฉืงืข ืชื—ื•ื ืื™ื ื˜ืจื ื˜ ืื™ื˜ืจื˜ื™ื‘ื™ื™ื ื•ืžืงื‘ื™ืœื™ื. ืฉื ื™ ืฉืจืชื™ื ืืœื• ืžื™ื™ืฉืžื™ื ื’ืจืกื” ืคืฉื•ื˜ื” ืฉืœ โ€‹โ€‹ืฉื™ืจื•ืช ื”ืืงื• (RFC 862), ื”ืžื—ื–ื™ืจื” ืขื•ืชืง ืฉืœ ื›ืœ ื”ื•ื“ืขื” ืฉื ืฉืœื—ื” ืืœื™ื• ืขืœ ื™ื“ื™ ืœืงื•ื—.

ื”ื“ ืฉืจืช UDP ืื™ื˜ืจื˜ื™ื‘ื™

ื‘ืกืขื™ืฃ ื–ื” ื•ื‘ื—ืœืง ื”ื‘ื ื ืฆื™ื’ ืืช ื”ืฉืจืชื™ื ืœืฉื™ืจื•ืช ื”ื“. ื”ื•ื ื–ืžื™ืŸ ื‘ื™ืฆื™ืื” ืžืกืคืจ 7 ื•ืขื•ื‘ื“ ื’ื ืขืœ UDP ื•ื’ื ืขืœ TCP (ื™ืฆื™ืื” ื–ื• ืฉืžื•ืจื”, ื•ืœื›ืŸ ื™ืฉ ืœื”ืคืขื™ืœ ืืช ืฉืจืช ื”ื”ื“ ืขื ื”ืจืฉืื•ืช ืžื ื”ืœ).

ืฉืจืช ื”ื“ UDP ืงื•ืจื ื‘ืจืฆื™ืคื•ืช ื“ื’ื™ืžื•ืช ื ืชื•ื ื™ื ื•ืžื—ื–ื™ืจ ืขื•ืชืงื™ื ืฉืœื”ืŸ ืœืฉื•ืœื—. ืžื›ื™ื•ื•ืŸ ืฉื”ืฉืจืช ืฆืจื™ืš ืœืขื‘ื“ ืจืง ื”ื•ื“ืขื” ืื—ืช ื‘ื›ืœ ืคืขื, ืืจื›ื™ื˜ืงื˜ื•ืจื” ืื™ื˜ืจื˜ื™ื‘ื™ืช ืชืกืคื™ืง. ืงื•ื‘ืฅ ื”ื›ื•ืชืจืช ืฉืœ ื”ืฉืจืชื™ื ืžื•ืฆื’ ื‘ืจื™ืฉื•ื 56.1.

ืจืฉื™ืžืช 56.1. ืงื•ื‘ืฅ ื›ื•ืชืจืช ืขื‘ื•ืจ ื”ืชื•ื›ื ื™ื•ืช id_echo_sv.c ื•-id_echo_cl.c

#include "inet_sockets.h" /* ืžื›ืจื™ื– ืขืœ ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ื”ืฉืงืข ืฉืœื ื• */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* ืฉื ืฉื™ืจื•ืช UDP */

#define BUF_SIZE 500 /* ื’ื•ื“ืœ ืžืงืกื™ืžืœื™ ืฉืœ ื’ืจื ื ืชื•ื ื™ื
ื ื™ืชืŸ ืœืงืจื•ื ืขืœ ื™ื“ื™ ืœืงื•ื— ื•ืฉืจืช */
__________________________________________________________________sockets/id_echo.h

ืจื™ืฉื•ื 56.2 ืžืฆื™ื’ ืืช ื™ื™ืฉื•ื ื”ืฉืจืช. ื›ื“ืื™ ืœืฉื™ื ืœื‘ ืœื ืงื•ื“ื•ืช ื”ื‘ืื•ืช:

  • ื›ื“ื™ ืœื”ื›ื ื™ืก ืืช ื”ืฉืจืช ืœืžืฆื‘ daemon, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืคื•ื ืงืฆื™ื” becomeDaemon() ืžืกืขื™ืฃ 37.2;

  • ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ืชื•ื›ื ื™ืช ืœืงื•ืžืคืงื˜ื™ืช ื™ื•ืชืจ, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืกืคืจื™ื™ื” ืœืขื‘ื•ื“ื” ืขื ืฉืงืขื™ ืชื—ื•ื ืื™ื ื˜ืจื ื˜, ืฉืคื•ืชื—ื” ื‘ืกืขื™ืฃ 55.12;

  • ืื ื”ืฉืจืช ืœื ื™ื›ื•ืœ ืœื”ื—ื–ื™ืจ ืชื’ื•ื‘ื” ืœืœืงื•ื—, ื”ื•ื ื›ื•ืชื‘ ื”ื•ื“ืขื” ืœืœื•ื’ ื‘ืืžืฆืขื•ืช ื”ืงืจื™ืื” () syslog.

ื‘ื™ื™ืฉื•ื ืืžื™ืชื™, ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื ื˜ื™ืœ ืžื’ื‘ืœื” ืžืกื•ื™ืžืช ืขืœ ืชื“ื™ืจื•ืช ืจื™ืฉื•ื ื”ื•ื“ืขื•ืช ื‘ืืžืฆืขื•ืช syslog(). ื–ื” ื™ื‘ื˜ืœ ืืช ื”ืืคืฉืจื•ืช ืฉืœ ืชื•ืงืฃ ืœื”ืฆื™ืฃ ืืช ื™ื•ืžืŸ ื”ืžืขืจื›ืช. ื‘ื ื•ืกืฃ, ืืœ ืชืฉื›ื— ืฉื›ืœ ืงืจื™ืื” ืœ-syslog() ื”ื™ื ื“ื™ ื™ืงืจื”, ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืžืฉืชืžืฉืช ื‘-fsync() ื›ื‘ืจื™ืจืช ืžื—ื“ืœ.

ืจืฉื™ืžืช 56.2. ืฉืจืช ืื™ื˜ืจืฆื™ื” ืฉืžื™ื™ืฉื ืืช ืฉื™ืจื•ืช ื”ื“ UDP

_________________________________________________________________sockets/id_echo_sv.c
#ืœึดื›ืœื•ึนืœ
#include "id_echo.h"
#include "become_daemon.h"

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

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

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
if (sfd == -1) {
syslog(LOG_ERR, "ืœื ื ื™ืชืŸ ืœื™ืฆื•ืจ ืฉืงืข ืฉืจืช (%s)",
strerror(errno));
exit(EXIT_FAILURE);

/* ืงื‘ืœืช ื“ื’ื™ืžื•ืช ื ืชื•ื ื™ื ื•ื”ื—ื–ืจืช ืขื•ืชืงื™ื ืฉืœื”ืŸ ืœืฉื•ืœื—ื™ื */
}
ืœ (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

if (numRead == -1)
errExit("recvfrom");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "ืฉื’ื™ืื” ื‘ื”ื“ ืชื’ื•ื‘ื” ืœ-%s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c

ื›ื“ื™ ืœื‘ื—ื•ืŸ ืืช ืคืขื•ืœืช ื”ืฉืจืช, ืื ื• ืžืฉืชืžืฉื™ื ื‘ืชื•ื›ื ื” ืž- Listing 56.3. ื”ื•ื ื’ื ืžืฉืชืžืฉ ื‘ืกืคืจื™ื™ื” ืœืขื‘ื•ื“ื” ืขื ืฉืงืขื™ ืชื—ื•ื ืื™ื ื˜ืจื ื˜, ืฉืคื•ืชื—ื• ื‘ืกืขื™ืฃ 55.12. ื›ืืจื’ื•ืžื ื˜ ืฉื•ืจืช ื”ืคืงื•ื“ื” ื”ืจืืฉื•ืŸ, ืชื•ื›ื ื™ืช ื”ืœืงื•ื— ืœื•ืงื—ืช ืืช ื”ืฉื ืฉืœ ืฆื•ืžืช ื”ืจืฉืช ืขืœื™ื• ื ืžืฆื ื”ืฉืจืช. ื”ืœืงื•ื— ื ื›ื ืก ืœืœื•ืœืื” ืฉื‘ื” ื”ื•ื ืฉื•ืœื— ื›ืœ ืื—ื“ ืžื”ืืจื’ื•ืžื ื˜ื™ื ื”ื ื•ืชืจื™ื ืœืฉืจืช ื›ื’ืจืžื•ืช ื ืชื•ื ื™ื ื ืคืจื“ื•ืช, ื•ืœืื—ืจ ืžื›ืŸ ืงื•ืจื ื•ืžื“ืคื™ืก ืืช ื’ืจืžื•ืช ื”ื ืชื•ื ื™ื ืฉื”ื•ื ืžืงื‘ืœ ืžื”ืฉืจืช ื‘ืชื’ื•ื‘ื”.

ืจืฉื™ืžืช 56.3. ืœืงื•ื— ืœืฉื™ืจื•ืช ื”ื“ UDP

#include "id_echo.h"

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

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

/* ืฆื•ืจ ืืช ื›ืชื•ื‘ืช ื”ืฉืจืช ื‘ื”ืชื‘ืกืก ืขืœ ื”ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
if (sfd == -1)
fatal("ืœื ื ื™ืชืŸ ืœื”ืชื—ื‘ืจ ืœืฉืงืข ื”ืฉืจืช");

/* ืฉืœื— ืืช ื”ืืจื’ื•ืžื ื˜ื™ื ื”ื ื•ืชืจื™ื ืœืฉืจืช ื‘ืฆื•ืจื” ืฉืœ ื“ื˜ืื’ืจืžื•ืช ื ืคืจื“ื•ืช */
ืขื‘ื•ืจ (j = 2; j < argc; j++) {
len = strlen(argv[j]);
if (ื›ืชื•ื‘(sfd, argv[j], len) != len)
fatal("ื›ืชื™ื‘ื” ื—ืœืงื™ืช/ื ื›ืฉืœื”");

numRead = read(sfd, buf, BUF_SIZE);
if (numRead == -1)
errExit("read");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
exit(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

ืœื”ืœืŸ ื“ื•ื’ืžื” ืœืžื” ืฉื ืจืื” ื‘ืขืช ื”ืคืขืœืช ื”ืฉืจืช ื•ืฉื ื™ ืžื•ืคืขื™ ืœืงื•ื—:

$su // ื”ืจืฉืื•ืช ื ื“ืจืฉื•ืช ื›ื“ื™ ืœื”ื™ืงืฉืจ ืœื ืžืœ ืฉืžื•ืจ
ืกื™ืกืžื”:
# ./id_echo_sv // ื”ืฉืจืช ืขื•ื‘ืจ ืœืžืฆื‘ ืจืงืข
# exit // ืœื•ื•ืชืจ ืขืœ ื–ื›ื•ื™ื•ืช ื”ืžื ื”ืœ
$ ./id_echo_cl localhost hello world // ืœืงื•ื— ื–ื” ืฉื•ืœื— ืฉื ื™ ื ืชื•ื ื™ื ื’ืจืžื™ื
[5 bytes] hello // ื”ืœืงื•ื— ืžืฆื™ื’ ืืช ื”ืชื’ื•ื‘ื” ืฉื”ืชืงื‘ืœื” ืžื”ืฉืจืช
[5 ื‘ืชื™ื] ืขื•ืœื
$ ./id_echo_cl localhost ืœื”ืชืจืื•ืช // ืœืงื•ื— ื–ื” ืฉื•ืœื— ื“ืื˜ื”ื’ืจื ืื—ื“
[7 ื‘ืชื™ื] ืœื”ืชืจืื•ืช

ืื ื™ ืžืื—ืœ ืœืš ืงืจื™ืื” ืžื”ื ื”)

ืžืงื•ืจ: linux.org.ru