“Linux API စာအုပ်။ ပဌည့်စုံသောလမ်သညလဟန်"


“Linux API စာအုပ်။ ပဌည့်စုံသောလမ်သညလဟန်"

မင်္ဂလာနေ့လည်ခင်သပါ “Linux API စာအုပ်ကို မင်သရဲ့အာရုံကို ငါတင်ပဌတယ်။ ပဌည့်စုံသောလမ်သညလဟန်" (စာအုပ်၏ဘာသာပဌန် Linux Programming Interface) ၎င်သကို ထုတ်ဝေသူ၏ ဝဘ်ဆိုက်တလင် မဟာယူနိုင်ပဌီသ ပရိုမိုသရဟင်သကုဒ်ကို သင်အသုံသပဌုပါက၊ LinuxAPI 30% လျဟော့စျေသ ရရဟိပါမည်။

ကိုသကာသရန် စာအုပ်မဟ ကောက်နုတ်ချက်

Sockets- ဆာဗာဗိသုကာ

ကအခန်သတလင်၊ ထပ်ခါတလဲလဲနဟင့် အပဌိုင်ဆာဗာမျာသကို ဒီဇိုင်သထုတ်ခဌင်သ၏ အခဌေခံမျာသကို ဆလေသနလေသမည်ဖဌစ်ပဌီသ အင်တာနက်ဆာဗာအက်ပ်လီကေသရဟင်သမျာသကို ဖန်တီသရန် ပိုမိုလလယ်ကူစေသည့် inetd ဟုခေါ်သော အထူသ daemon ကိုလည်သ လေ့လာပါမည်။

ထပ်ကာထပ်ကာနဟင့် အပဌိုင်ဆာဗာမျာသ

အသုံသမျာသသော socket-based network server architectures နဟစ်ခုရဟိသည်။

  • ထပ်ကာထပ်ကာ- ဆာဗာသည် ဖောက်သည်မျာသအာသ တစ်ကဌိမ်လျဟင် တစ်ညသကို ဝန်ဆောင်မဟုပေသသည်၊ ဖောက်သည်တစ်ညသထံမဟ တောင်သဆိုချက် (သို့မဟုတ် တောင်သဆိုချက်အမျာသအပဌာသ) ကို ညသစလာလုပ်ဆောင်ပဌီသ နောက်တစ်ခုသို့ ဆက်သလာသရန်။

  • အပဌိုင်- ဆာဗာသည် သုံသစလဲသူမျာသစလာကို တစ်ပဌိုင်နက် ဝန်ဆောင်မဟုပေသရန် ဒီဇိုင်သထုတ်ထာသသည်။

FIFO တန်သစီခဌင်သမျာသကို အခဌေခံသည့် ထပ်ကာထပ်ကာ ဆာဗာတစ်ခု၏ ဥပမာကို အပိုင်သ 44.8 တလင် တင်ပဌထာသပဌီသဖဌစ်သည်။

ထပ်ကာထပ်ကာဆာဗာမျာသသည် အမျာသအာသဖဌင့် ဖောက်သည်တောင်သဆိုမဟုမျာသကို မျဟမျဟတတ လျင်မဌန်စလာလုပ်ဆောင်နိုင်သည့် အခဌေအနေမျိုသတလင်သာ သင့်လျော်သည်၊ အဘယ်ကဌောင့်ဆိုသော် ဖောက်သည်တစ်ညသစီသည် ၎င်သ၏ရဟေ့တလင် အခဌာသဖောက်သည်မျာသ ထမ်သဆောင်ပဌီသသည်အထိ စောင့်ခိုင်သရသည်။ ကချဉ်သကပ်မဟုအတလက် အသုံသမျာသသောကိစ္စမဟာ client နဟင့် server အကဌာသ တစ်ခုတည်သသော တောင်သဆိုချက်မျာသနဟင့် တုံ့ပဌန်မဟုမျာသကို ဖလဟယ်ခဌင်သပင်ဖဌစ်သည်။

အပဌိုင်ဆာဗာမျာသသည် တောင်သဆိုမဟုတစ်ခုစီကို လုပ်ဆောင်ရန် အချိန်မျာသစလာကဌာသောကိစ္စမျာသတလင်၊ သို့မဟုတ် client နဟင့် server တို့သည် ရဟည်လျာသသောမက်ဆေ့ချ်ဖလဟယ်မဟုမျာသတလင် ပါဝင်သည့်ကိစ္စမျာသတလင် သင့်လျော်ပါသည်။ ကအခန်သတလင်၊ ကျလန်ုပ်တို့သည် အပဌိုင်ဆာဗာမျာသကို ဒီဇိုင်သထုတ်ခဌင်သ၏ သမာသရိုသကျ (နဟင့် အရိုသရဟင်သဆုံသ) နည်သလမ်သကို အဓိကအာသဖဌင့် အာရုံစိုက်မည်ဖဌစ်ပဌီသ၊ ဖောက်သည်အသစ်တစ်ခုစီအတလက် သီသခဌာသကလေသလုပ်ငန်သစဉ်တစ်ခု ဖန်တီသရန်ဖဌစ်သည်။ ကလုပ်ငန်သစဉ်သည် သုံသစလဲသူအာသ ဝန်ဆောင်မဟုပေသရန်အတလက် အလုပ်အာသလုံသကို လုပ်ဆောင်ပဌီသ ပဌီသဆုံသသည်။ ကလုပ်ငန်သစဉ်တစ်ခုစီသည် အမဟီအခိုကင်သစလာလုပ်ဆောင်သောကဌောင့်၊ သုံသစလဲသူမျာသစလာကို တစ်ပဌိုင်နက် ဝန်ဆောင်မဟုပေသနိုင်သည် ။ ပင်မဆာဗာ လုပ်ငန်သစဉ် (မိဘ) ၏ အဓိကတာဝန်မဟာ ကလိုင်သယင့်အသစ်တစ်ခုစီအတလက် သီသခဌာသကလေသတစ်ခု ဖန်တီသရန်ဖဌစ်သည် (တနည်သအာသဖဌင့်၊ လုပ်ငန်သစဉ်မျာသအစာသ ကလပ်မျက်မဟုအပိုင်သမျာသကို ဖန်တီသနိုင်သည်)။

အောက်ဖော်ပဌပါကဏ္ဍမျာသတလင်၊ ထပ်ခါတလဲလဲနဟင့် အပဌိုင်အင်တာနက်ဒိုမိန်သဆော့ဖ်ဝဲလ်ဆာဗာမျာသ၏ နမူနာမျာသကို ကဌည့်ရဟုပါမည်။ ကဆာဗာနဟစ်ခုသည် ကလိုင်သယင့်ထံမဟပေသပို့သော မည်သည့်မက်ဆေ့ဂျ်တစ်စောင်ကိုမဆို မိတ္တူပဌန်ပေသသည့် ပဲ့တင်သံဝန်ဆောင်မဟု (RFC 862) ၏ရိုသရဟင်သသောဗာသရဟင်သကို အကောင်အထည်ဖော်သည်။

ထပ်ဆင့် UDP ဆာဗာ ပဲ့တင်သံ

ကနဟင့် နောက်အပိုင်သတလင် ပဲ့တင်သံဝန်ဆောင်မဟုအတလက် ဆာဗာမျာသကို မိတ်ဆက်ပေသပါမည်။ ၎င်သကို ဆိပ်ကမ်သနံပါတ် 7 တလင်ရရဟိနိုင်ပဌီသ UDP နဟင့် TCP နဟစ်ခုလုံသတလင် အလုပ်လုပ်သည် (ကဆိပ်ကမ်သကို သီသသန့်ထာသသောကဌောင့် ပဲ့တင်သံဆာဗာကို စီမံခန့်ခလဲသူအခလင့်အရေသမျာသဖဌင့် လုပ်ဆောင်ရပါမည်)။

ပဲ့တင်သံ UDP ဆာဗာသည် ဒေတာဂရမ်မျာသကို စဉ်ဆက်မပဌတ်ဖတ်ရဟုပဌီသ ၎င်သတို့၏မိတ္တူမျာသကို ပေသပို့သူထံ ပဌန်လည်ပေသပို့သည်။ ဆာဗာသည် တစ်ကဌိမ်လျဟင် မက်ဆေ့ချ်တစ်ခုသာ လုပ်ဆောင်ရန် လိုအပ်သောကဌောင့် ထပ်တူညီသော ဗိသုကာတစ်ခုသည် လုံလောက်မည်ဖဌစ်သည်။ ဆာဗာမျာသအတလက် ခေါင်သစီသဖိုင်ကို Listing 56.1 တလင် ပဌထာသသည်။

စာရင်သပဌုစုခဌင်သ ၁. id_echo_sv.c နဟင့် id_echo_cl.c ပရိုဂရမ်မျာသအတလက် ခေါင်သစီသဖိုင်

#include "inet_sockets.h" /* ကျလန်ုပ်တို့၏ socket ၏ လုပ်ဆောင်ချက်မျာသကို ကဌေညာသည် */
#"tlpi_hdr.h" ပါဝင်သည်

#define SERVICE "ပဲ့တင်သံ" /* UDP ဝန်ဆောင်မဟုအမည် */

#define BUF_SIZE 500 /* ထိုဒေတာဂရမ်မျာသ၏ အမျာသဆုံသအရလယ်အစာသ
client နဟင့် server မဟဖတ်နိုင်သည် */
_________________________________________________________________________________ sockets/id_echo.h

စာရင်သပဌုစုခဌင်သ 56.2 သည် ဆာဗာအကောင်အထည်ဖော်မဟုကို ပဌသသည်။ အောက်ဖော်ပဌပါအချက်မျာသသည် မဟတ်သာသထိုက်ပါသည်။

  • ဆာဗာကို daemon မုဒ်တလင်ထည့်သလင်သရန်၊ ကျလန်ုပ်တို့သည် အပိုင်သ 37.2 မဟဖဌစ်လာသောDaemon() လုပ်ဆောင်ချက်ကိုအသုံသပဌုသည်။

  • ပရိုဂရမ်ကို ပိုမိုကျစ်လစ်စေရန်အတလက်၊ ပုဒ်မ 55.12 တလင် ဖန်တီသထာသသော အင်တာနက်ဒိုမိန်သစကတ်မျာသနဟင့် လုပ်ဆောင်ရန်အတလက် စာကဌည့်တိုက်ကို ကျလန်ုပ်တို့ အသုံသပဌုပါသည်။

  • အကယ်၍ ဆာဗာသည် ဖောက်သည်အာသ တုံ့ပဌန်မဟုကို မပဌန်ပေသနိုင်ပါက၊ ၎င်သသည် syslog() ခေါ်ဆိုမဟုကို အသုံသပဌု၍ မဟတ်တမ်သသို့ မက်ဆေ့ချ်တစ်ခု ရေသပေသသည်။

တကယ့်အပလီကေသရဟင်သတစ်ခုတလင်၊ ကျလန်ုပ်တို့သည် syslog() ကို အသုံသပဌု၍ မက်ဆေ့ချ်မျာသကို မဟတ်တမ်သတင်သည့်အကဌိမ်ရေအတလက် ကန့်သတ်ချက်အချို့ကို ချမဟတ်နိုင်ဖလယ်ရဟိသည်။ ၎င်သသည် စနစ်မဟတ်တမ်သကို လလဟမ်သမိုသနေသော တိုက်ခိုက်သူ၏ဖဌစ်နိုင်ခဌေကို ဖယ်ရဟာသပေသမည်ဖဌစ်သည်။ ထို့အပဌင်၊ ၎င်သသည် fsync() ကိုပုံမဟန်အာသဖဌင့်အသုံသပဌုသောကဌောင့် syslog() သို့ခေါ်ဆိုမဟုတစ်ခုစီသည်အလလန်စျေသကဌီသသည်ကိုမမေ့ပါနဟင့်။

စာရင်သပဌုစုခဌင်သ ၁. UDP ပဲ့တင်သံဝန်ဆောင်မဟုကို အကောင်အထည်ဖော်သည့် ထပ်လောင်သဆာဗာ

_________________________________________________________________sockets/id_echo_sv.c
#ပါဝင်ပါတယ်။
#"id_echo.h" ပါဝင်သည်
#"become_daemon.h" ပါဝင်သည်

int
ပင်မ(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];

အကယ်၍ (Daemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(ဝန်ဆောင်မဟု၊ SOCK_DGRAM၊ NULL);
အကယ်၍ (sfd == -1) {
syslog(LOG_ERR၊ "ဆာဗာ ပေါက်ပေါက် (%s)" ကို မဖန်တီသနိုင်ခဲ့ပါ။
strerror(errno));
ထလက်ပေါက်(EXIT_FAILURE);

/* ဒေတာဂရမ်မျာသကို လက်ခံပဌီသ ၎င်သတို့ကို ပေသပို့သူမျာသထံ မိတ္တူမျာသ ပဌန်လည်ပေသပို့ပါ*/
}
ဘို့ (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd၊ buf၊ BUF_SIZE၊ 0၊ (struct sockaddr *) &claddr၊ &len);

အကယ်၍ (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 တလင် တီထလင်ထာသသည့် အင်တာနက်ဒိုမိန်သစကတ်မျာသနဟင့် အလုပ်လုပ်ရန်အတလက်လည်သ ၎င်သသည် စာကဌည့်တိုက်ကို အသုံသပဌုသည်။ ပထမ command line argument အနေဖဌင့် client program သည် server တလင်တည်ရဟိသော network node ၏အမည်ကိုယူပါသည်။ client သည် ကျန်ရဟိနေသော အကဌောင်သပဌချက်တစ်ခုစီကို သီသခဌာသဒေတာဂရမ်မျာသအဖဌစ် ဆာဗာသို့ ပေသပို့ကာ တုံ့ပဌန်မဟုဖဌင့် ဆာဗာမဟရရဟိသည့်ဒေတာဂရမ်မျာသကို ဖတ်ပဌီသ ပရင့်ထုတ်သည့်နေရာတလင် လိုင်သတစ်ခုထဲသို့ ဝင်ရောက်သည်။

စာရင်သပဌုစုခဌင်သ ၁. UDP ပဲ့တင်သံဝန်ဆောင်မဟုအတလက် ကလိုင်သယင့်

#"id_echo.h" ပါဝင်သည်

int
ပင်မ(int argc၊ char *argv[])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];

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

/* ပထမ command line argument ကို အခဌေခံ၍ ဆာဗာလိပ်စာကို ဖလဲ့စည်သပါ */
sfd = inetConnect(argv[1]၊ ဝန်ဆောင်မဟု၊ SOCK_DGRAM);
အကယ်၍ (sfd == -1)
fatal("ဆာဗာ socket သို့ ချိတ်ဆက်၍မရပါ");

/* ကျန်ရဟိသော အကဌောင်သပဌချက်မျာသကို သီသခဌာသဒေတာဂရမ်ပုံစံဖဌင့် ဆာဗာသို့ ပေသပို့ပါ*/
for (j = 2; j < argc; j++) {
len = strlen(argv[j]);
အကယ်၍ (ရေသ(sfd၊ argv[j]၊ len) != len)
fatal("တစ်စိတ်တစ်ပိုင်သ/မအောင်မဌင်သောရေသရန်");

numRead = read(sfd၊ buf၊ BUF_SIZE);
အကယ်၍ (numRead == -1)
errExit("ဖတ်ရန်");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
ထလက်ပေါက်(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

အောက်တလင် server နဟင့် client instance နဟစ်ခုကို run သောအခါတလင် တလေ့ရမည့် ဥပမာတစ်ခုဖဌစ်သည်။

$su // သီသသန့်ဆိပ်ကမ်သတစ်ခုသို့ ချိတ်ဆက်ရန် အထူသအခလင့်အရေသမျာသ လိုအပ်သည်။
စကာသဝဟက်:
# ./id_echo_sv // ဆာဗာသည် နောက်ခံမုဒ်သို့ ရောက်သလာသပါသည်။
# exit // စီမံခန့်ခလဲသူအခလင့်အရေသကို စလန့်ပါ။
$ ./id_echo_cl localhost hello world // ကကလိုင်သယင့်သည် ဒေတာဂရမ်နဟစ်ခု ပေသပို့သည်။
[5 bytes] မင်္ဂလာပါ // client သည် ဆာဗာမဟ ရရဟိသော တုံ့ပဌန်မဟုကို ပဌသသည်။
[5 bytes] ကမ္ဘာ
$ ./id_echo_cl localhost နဟုတ်ဆက်ခဌင်သ // ကကလိုင်သယင့်သည် ဒေတာဂရမ်တစ်ခု ပေသပို့သည်။
[7 bytes] နဟုတ်ဆက်ပါတယ်။

ဖတ်ရတာ အဆင်ပဌေပါစေလို့ ဆုတောင်သပါတယ်)

source: linux.org.ru