рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рднреЗрджреНрдпрддрд╛ (рдФрд░ рди рдХреЗрд╡рд▓), рдбреАрдУрдПрд╕

рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЛрдб рдЬреЛ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ (рд╕рднреА рдХреЛрд░ рдХрд╛ 100% рд▓реЛрдб, рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдердХрд╛рд╡рдЯ)ред



рдХреЛрдб рд▓рд┐рдВрдХ: lkml.org/lkml/2010/11/25/8



27, 32 рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреА рдЧрдИ - рд╣реИрдВрдЧ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 32/64 рдмрд┐рдЯреНрд╕ред



рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛: 1-2 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдХреНрд░реИрд╢ рдбрдВрдк рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ (рдореЗрд░реЗ рдкрд╛рд╕ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ), рдореЗрдЬрдмрд╛рди рдУрд╡рд░рд▓реЛрдб рд╣реИред рдПрдХ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рд▓рдЧрднрдЧ 5-7 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж) рд╕рд┐рд╕реНрдЯрдо рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ред



рд▓реМрд░рд╛ рдХреЗ PS рдПрдХреНрд╕рдкрд░реНрдЯреНрд╕ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ FreeBSD 8.1 рднреА рдХреНрд░реИрд╢ рдХрд░рддрд╛ рд╣реИред



PPS рдЕрдЪрд╛рдирдХ - CentOS 5.5 рдкрд░ 2.6.18 рд╕реЗ рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд░реВрдЯ, рдбреНрд░реЙрдк, рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ - рдмрд╕ рдЪреБрдкрдЪрд╛рдк рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд╕рдиреНрди рдХрдВрд╕реЛрд▓ рдореЗрдВ рд░реВрдЯ рдХрд╛рдо рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреНрд░реИрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред



рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ:



1) рдПрдХ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде CentOS 2.6.18 / 64 рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

2) рдбреЗрдмрд┐рдпрди рдирд┐рдЪреЛрдбрд╝ 2.6.34 / 64 рдПрдХ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЧрд┐рд░реА рдШрдмрд░рд╛рд╣рдЯ)ред

3) рдЕрдлрд╡рд╛рд╣реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХреБрдЫ FreeBSD рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ - FreeBSD 8.2-PRERELEASE play рдирд╣реАрдВ рдХрд░рддрд╛)

4) рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ - Ubuntu 2.6.32 / 64 рдкрд░ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, 2.6.36 рдкрд░ рдЗрд╕реЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

5) рдЙрдмрдВрдЯреВ 2.6.34 / 64 - рдЦреЗрд▓рдиреЗ рдпреЛрдЧреНрдп

6) рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ - RHEL5.5 рдлреНрд░реАрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

7) рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ: FreeBSD 4.11, 8.1, OpebBSD 4.6, 4.8, DragonFLY BSD 2.8.0 - рдкреНрд░рднрд╛рд╡рд┐рдд

8) рдУрдкрдирд╡реАрдЬреЗрдб + 2.6.18 рдбреЗрдмрд┐рдпрди / рд╕реЗрдВрдЯреЛрд╕ - рдЦреЗрд▓рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВред



рдкреАрдкреАрдкреАрдПрд╕ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ - рдЧреИрд░-рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред



рдкрд░реАрдХреНрд╖рдг рдкрд╛рда:



 #include <sys / socket.h>
 # рдЕрд▓рдЧ рдХрд░реЗрдВ <sys / un.h>

 рд╕реНрдерд┐рд░ int send_fd (int unix_fd, int fd)
 {
   рд╕рдВрд░рдЪрдирд╛ msghdr msgh;
   рд╕рдВрд░рдЪрдирд╛ cmsghdr * cmsg;
   char buf [CMSG_SPACE (sizeof (fd))];
   рдореЗрдорд╕реЗрдЯ (& msgh, 0, sizeof (msgh));
   рдореЗрдорд╕реЗрдЯ (buf, 0, sizeof (buf));

   msgh.msg_control = buf;
   msgh.msg_controllen = sizeof (buf);

   cmsg = CMSG_FIRSTHDR (& msgh);
   cmsg-> cmsg_len = CMSG_LEN (sizeof (fd));
   cmsg-> cmsg_level = SOL_SOCKET;
   cmsg-> cmsg_type = SCM_RIGHTS;

   msgh.msg_controllen = cmsg-> cmsg_len;

   memcpy (CMSG_DATA (cmsg), & fd, sizeof (fd));
   рд░рд┐рдЯрд░реНрди рд╕реЗрдВрдореНрд╕рдЧ (unix_fd, рдФрд░ msgh, 0);
 }

 int main ()
 {
   int fd [2], ff [2];
   int рд▓рдХреНрд╖реНрдп;
   рдЕрдЧрд░ (рд╕реЙрдХреЗрдЯрдкреЗрдпрд░ (PF_UNIX, SOCK_SEQPACKET, 0, fd) == - 1)
     рд╡рд╛рдкрд╕реА 1;
   (;;) рдХреЗ рд▓рд┐рдП
   {
     рдЕрдЧрд░ (рд╕реЙрдХреЗрдЯрдкреЗрдпрд░ (PF_UNIX, SOCK_SEQPACKET, 0, ff) == - 1)
	 рд╡рд╛рдкрд╕реА 2;
     send_fd (ff [0], fd [0]);
     send_fd (ff [0], fd [1]);
     рдмрдВрдж (рдПрдлрдбреА [1]);
     рдмрдВрдж (рдПрдлрдбреА [рдХреЛ реж]);
     fd [0] = ff [0];
     fd [1] = ff [1];
   }
 }



All Articles