рдкреНрд░рд╕реНрддреБрдд рд╣реИ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░

рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди (IPC) рдкреНрд░реЛрд╕реЗрд╕ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдФрд░ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЬреБрдбрд╝реЗ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдИрдкреАрд╕реА рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛ рд╕рдХрддреА рд╣реИ: "рд╕рд┐рдЧреНрдирд▓", "рд╕реЙрдХреЗрдЯ", "рд╕реЗрдореАрдлреЛрд░", "рдлрд╛рдЗрд▓", "рдореИрд╕реЗрдЬ" ...

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рей рдкреНрд░рдХрд╛рд░ рдХреЗ IPC рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:
  1. рдирд╛рдорд┐рдд рдкрд╛рдЗрдк
  2. рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рд╕реНрдореГрддрд┐
  3. рд╕рд┐рдХрдВрджрд░рд╛
рдкрд╛рдЪрди: рдпрд╣ рд▓реЗрдЦ рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ рдЬреЛ рдЕрднреА рднреА рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдорд╛рд░реНрдЧ рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ POSIX- рд╕рдВрдЧрдд OS рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реИред

рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рдкрд╛рдЗрдк


рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реЙрдХреЗрдЯ, рдЪреИрдирд▓, рдбреА-рдмрд╕ рдФрд░ рдЕрдиреНрдп рддрдХрдиреАрдХреЛрдВ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╣рд░ рдХреЛрдиреЗ рдкрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдбреА-рдмрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдо-рд▓рдЧрдиреЗ рд╡рд╛рд▓реА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ POSIX рдорд╛рдирдХреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред

рдирд╛рдорд┐рдд рдкрд╛рдЗрдк рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдирд╛рдорд┐рдд рдкрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди mkfifo () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
#include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode); 

рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рд╢реЗрд╖ FIFO рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо pathname рд╣реИ , рдФрд░ рдореЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдиреЛрдЯ: рдореЛрдб рд╡рд░реНрддрдорд╛рди umask рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ( рдореЛрдб рдФрд░ ~ umask) ред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдСрдорд╕реНрдХ рдорд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╣рдо 0777 ( S_IRWXO | S_IRWXG | S_IRWXU ) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдХ рдХреЗ рдПрдХ рдмрд┐рдЯ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдмрд╛рд░ рдлрд╛рдЗрд▓ рдмрди рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЛрдИ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓ рд╕рдХрддреА рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ / рдереНрд░реЗрдбреНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рде рдЦреЛрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдирд╛) рдФрд░ рджреВрд╕рд░рд╛ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░ (рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдирд╛) рдХреЗ рд▓рд┐рдПред

рдпрджрд┐ FIFO рдлрд╝рд╛рдЗрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рддреЛ mkfifo () рд░рд┐рдЯрд░реНрди 0 (рд╢реВрдиреНрдп)ред рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди -1 рд▓реМрдЯрддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рдЧрд▓рдд рдЪрд░ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдЪреИрдирд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ:рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд░реАрдб () рдФрд░ рд░рд╛рдЗрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


mkfifo.c
 #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <stdio.h> #define NAMEDPIPE_NAME "/tmp/my_named_pipe" #define BUFSIZE 50 int main (int argc, char ** argv) { int fd, len; char buf[BUFSIZE]; if ( mkfifo(NAMEDPIPE_NAME, 0777) ) { perror("mkfifo"); return 1; } printf("%s is created\n", NAMEDPIPE_NAME); if ( (fd = open(NAMEDPIPE_NAME, O_RDONLY)) <= 0 ) { perror("open"); return 1; } printf("%s is opened\n", NAMEDPIPE_NAME); do { memset(buf, '\0', BUFSIZE); if ( (len = read(fd, buf, BUFSIZE-1)) <= 0 ) { perror("read"); close(fd); remove(NAMEDPIPE_NAME); return 0; } printf("Incomming message (%d): %s\n", len, buf); } while ( 1 ); } 
[ рдбрд╛рдЙрдирд▓реЛрдб ]

рд╣рдо рдХреЗрд╡рд▓ ( O_RDONLY ) рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдФрд░ рд╡реЗ O_NONBLOCK рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ FIFO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВ рдХрд┐, рджреВрд╕рд░реА рдУрд░, рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдм рдЦреЛрд▓рд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
 $ gcc -o mkfifo mkfifo.c $ ./mkfifo 

рдЖрд╕рдиреНрди рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдХрд░реЗрдВ:
 $ echo 'Hello, my named pipe!' > /tmp/my_named_pipe 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦреЗрдВрдЧреЗ:
 $ ./mkfifo /tmp/my_named_pipe is created /tmp/my_named_pipe is opened Incomming message (22): Hello, my named pipe! read: Success 

рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рд╕реНрдореГрддрд┐


рдЕрдЧрд▓реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдВрдЯрд░рдкреНрд░реЛрд╕реЗрд╕ рд╕рдВрдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рд╣реИ ред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╛рдорд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо POSIX shm_open () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
 #include <sys/mman.h> int shm_open(const char *name, int oflag, mode_t mode); 

рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдгрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдордПрдордПрдкреА) ( рдпрд╛ рдПрдордкреНрд░реЛрдХреНрдЯреЗрдХ () ) рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдЦрдВрдбрддрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ / рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( shm_unlink () )ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ (рдпрджрд┐ рдЗрд╕рдХрд╛ рдирд╛рдо рдЬрд╛рдирддреА рд╣реИ) рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреА рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ shm_unlink () рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВред

рдЯреЛрд▓рдЧ рдЪрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдпрд╛ рдирд┐рдореНрди рдЭрдВрдбреЗ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:рдореЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл "рд╕рдВрджреЗрд╢ рдкрд╛рд╕рд┐рдВрдЧ" рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо ftruncate () рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рд╣рдорд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рд╣рдореЗрдВ рдЬрд┐рд╕ рдЖрдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг


рдирд┐рдореНрди рдХреЛрдб рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдмрдирд╛рдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рд╣рдо рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ shm_unlink () рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рддрдХ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

shm_open.c
 #include <unistd.h> #include <sys/types.h> #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #define SHARED_MEMORY_OBJECT_NAME "my_shared_memory" #define SHARED_MEMORY_OBJECT_SIZE 50 #define SHM_CREATE 1 #define SHM_PRINT 3 #define SHM_CLOSE 4 void usage(const char * s) { printf("Usage: %s <create|write|read|unlink> ['text']\n", s); } int main (int argc, char ** argv) { int shm, len, cmd, mode = 0; char *addr; if ( argc < 2 ) { usage(argv[0]); return 1; } if ( (!strcmp(argv[1], "create") || !strcmp(argv[1], "write")) && (argc == 3) ) { len = strlen(argv[2]); len = (len<=SHARED_MEMORY_OBJECT_SIZE)?len:SHARED_MEMORY_OBJECT_SIZE; mode = O_CREAT; cmd = SHM_CREATE; } else if ( ! strcmp(argv[1], "print" ) ) { cmd = SHM_PRINT; } else if ( ! strcmp(argv[1], "unlink" ) ) { cmd = SHM_CLOSE; } else { usage(argv[0]); return 1; } if ( (shm = shm_open(SHARED_MEMORY_OBJECT_NAME, mode|O_RDWR, 0777)) == -1 ) { perror("shm_open"); return 1; } if ( cmd == SHM_CREATE ) { if ( ftruncate(shm, SHARED_MEMORY_OBJECT_SIZE+1) == -1 ) { perror("ftruncate"); return 1; } } addr = mmap(0, SHARED_MEMORY_OBJECT_SIZE+1, PROT_WRITE|PROT_READ, MAP_SHARED, shm, 0); if ( addr == (char*)-1 ) { perror("mmap"); return 1; } switch ( cmd ) { case SHM_CREATE: memcpy(addr, argv[2], len); addr[len] = '\0'; printf("Shared memory filled in. You may run '%s print' to see value.\n", argv[0]); break; case SHM_PRINT: printf("Got from shared memory: %s\n", addr); break; } munmap(addr, SHARED_MEMORY_OBJECT_SIZE); close(shm); if ( cmd == SHM_CLOSE ) { shm_unlink(SHARED_MEMORY_OBJECT_NAME); } return 0; } 
[ рдбрд╛рдЙрдирд▓реЛрдб ]

рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо ftruncate () рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдордиреЗ mmap () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ред (рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓рддреЗ рд╣реБрдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ mmap () рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди shm_open () рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рддрдм рддрдХ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рдПрдЧреА рдЬрдм рддрдХ рдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдбрд┐рд▓реАрдЯ рдпрд╛ рд░рд┐рдмреВрдЯ рди тАЛтАЛрд╣реЛ рдЬрд╛рдПред)

рдЗрд╕ рдмрд╛рд░ рдЖрдкрдХреЛ -lrt рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 $ gcc -o shm_open -lrt shm_open.c 

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ:
 $ ./shm_open create 'Hello, my shared memory!' Shared memory filled in. You may run './shm_open print' to see value. $ ./shm_open print Got from shared memory: Hello, my shared memory! $ ./shm_open create 'Hello!' Shared memory filled in. You may run './shm_open print' to see value. $ ./shm_open print Got from shared memory: Hello! $ ./shm_open close $ ./shm_open print shm_open: No such file or directory 

рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреНрд░рд┐рдПрдЯ рд▓реЙрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореЗрдореЛрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо shm_unlink () рдХрд╣рддреЗ рд╣реИрдВ , рддреЛ рдореЗрдореЛрд░реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ O_CREATE рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ shm_open () рддреНрд░реБрдЯрд┐ "рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛" рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рд╕рд┐рдХрдВрджрд░рд╛


рдереНрд░реЗрдбреНрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░) рдХреЗ рд▓рд┐рдП рдХрдИ рдереНрд░реЗрдбреНрд╕ / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд╛рде рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ рд╣реИред рд╕реЗрдорд╛рдлреЛрд░реЗрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреА рд╣реИрдВред

рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
  1. рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ (рдЧрдгрдирд╛ рд╕реЗрдорд╛рдлреЛрд░), рдЬреЛ рдЙрди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
  2. рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд░рд╛рдЬреНрдп рд╣реИрдВ "0" рдпрд╛ "1" (рдЕрдзрд┐рдХ рдмрд╛рд░: "рд╡реНрдпрд╕реНрдд" рдпрд╛ "рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ")
рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реЗрдорд╛рдлреЛрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реЗрдорд╛рдлреЛрд░


рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЕрд░реНрде рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рджреЗрдирд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрди рдореБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдмрд╛рдХреА рд▓рд╛рдЗрди рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо POSIX рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ sem_open () :
 #include <semaphore.h> sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); 

рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ, рд╣рдо рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдЭрдВрдбреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд┐рд░реНрдорд┐рдд рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдирд╛рдо рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╣рдореЗрдВ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╕реЗрдорд╛рдлреЛрд░ рдорд┐рд▓рддрд╛ рд╣реИред
рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рдирд╛рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рддреАрдХ "/" (рд╕реНрд▓реИрд╢) рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рд▓реИрдЯрд┐рди рдЕрдХреНрд╖рд░ рд╣реИрдВред рд╕реНрд▓реЗрд╢ рдкреНрд░рддреАрдХ рдЕрдм рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реЗрдорд╛рдлреЛрд░ рдирд╛рдо 251 рд╡рд░реНрдгреЛрдВ рддрдХ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ O_CREATE рдирд┐рдпрдВрддреНрд░рдг рдзреНрд╡рдЬ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдПрдХ рдореМрдЬреВрджрд╛ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдЯреЙрдЧрд▓ рд╢реВрдиреНрдп рд╣реИред рдпрджрд┐ O_EXCL рдзреНрд╡рдЬ O_CREATE рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ sem_open () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдПрдЧрд╛ рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред

рдореЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╡реИрд▓реНрдпреВ рд╡реЗрд░рд┐рдПрдмрд▓ рд╕реЗрдореАрдлреЛрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдореЛрдб рдФрд░ рдореВрд▓реНрдп рдкреИрд░рд╛рдореАрдЯрд░ рджреЛрдиреЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рд╕реЗрдореАрдлреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ, рдФрд░ sem_open () O_CREATE рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдореМрдЬреВрджрд╛ рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 #include <semaphore.h> sem_t *sem_open(const char *name, int oflag); 
рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЙрдкрдорд╛ рдирд╛рдо рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдзреНрд╡рдЬ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рд╕реЗрдорд╛рдлреЛрд░


рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ рдФрд░ рджреВрд╕рд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдЖрдЧреЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред

sem_open.c
 #include <fcntl.h> #include <sys/stat.h> #include <semaphore.h> #include <stdio.h> #define SEMAPHORE_NAME "/my_named_semaphore" int main(int argc, char ** argv) { sem_t *sem; if ( argc == 2 ) { printf("Dropping semaphore...\n"); if ( (sem = sem_open(SEMAPHORE_NAME, 0)) == SEM_FAILED ) { perror("sem_open"); return 1; } sem_post(sem); perror("sem_post"); printf("Semaphore dropped.\n"); return 0; } if ( (sem = sem_open(SEMAPHORE_NAME, O_CREAT, 0777, 0)) == SEM_FAILED ) { perror("sem_open"); return 1; } printf("Semaphore is taken.\nWaiting for it to be dropped.\n"); if (sem_wait(sem) < 0 ) perror("sem_wait"); if ( sem_close(sem) < 0 ) perror("sem_close"); return 0; } 
[ рдбрд╛рдЙрдирд▓реЛрдб ]

рдПрдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЪрд▓рд╛рдПрдВ:
 $ ./sem_open Semaphore is taken. Waiting for it to be dropped. <--       sem_wait: Success sem_close: Success 

рдкрдбрд╝реЛрд╕реА рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдЪрд▓рд╛рдПрдБ:
 $ ./sem_open 1 Dropping semaphore... sem_post: Success Semaphore dropped. 

рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░


рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рдмрдЬрд╛рдп, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП sem_open рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдирд╛рдордХ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдорд╛рдлреЛрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ (рдпрд╛рдиреА, рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░: рд╡реНрдпрд╕реНрдд рдФрд░ рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ)ред рд▓реЗрдХрд┐рди рд╢рдмреНрдж "рдореНрдпреВрдЯреЗрдХреНрд╕" рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдПрдХ рдРрд╕реА рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдбреЗрдЯрд╛ / рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐ "рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХрд▓ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рдмрд╛рдЗрдирд░реА рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗрдореАрдлреЛрд░ рдХреЛ "рдХрдмреНрдЬрд╛" рдХрд░рддреА рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ "рд░рд┐рд▓реАрдЬ" рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЙрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд┐рдпрд╛ рдерд╛ред

рд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ pthread_mutex_init () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 #include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); 

рдлрд╝рдВрдХреНрд╢рди mutexattr рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдореНрдпреВрдЯреЗрдХреНрд╕ (рдЪрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ ) рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕рдЯреНрд░рд▓ NULL рд╣реИ , рддреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ (рдХреЛрдб 0 рд▓реМрдЯрд╛рддрд╛ рд╣реИ), рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ "рдореБрдХреНрдд" рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдпрд╛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); 

Pthread_mutex_lock () рдлрд╝рдВрдХреНрд╢рди, рдпрджрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╡реНрдпрд╕реНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорд╛рд▓рд┐рдХ рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╡реНрдпрд╕реНрдд рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдЧреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдореБрдХреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
Pthread_mutex_trylock () рдлрд╝рдВрдХреНрд╢рди pthread_mutex_lock () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рдорд╛рди рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде - рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╡реНрдпрд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ EBUSS рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИред
Pthread_mutex_unlock () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡реНрдпрд╕реНрдд рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

Pthread_mutex_lock () рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓реМрдЯрд╛рдПрдБ:Pthread_mutex_trylock () рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓реМрдЯрд╛рдПрдБ:Pthread_mutex_unlock () рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓реМрдЯрд╛рдПрдБ:

рдореНрдпреВрдЯреЗрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг


mutex.c
 #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <errno.h> static int counter; // shared resource static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void incr_counter(void *p) { do { usleep(10); // Let's have a time slice between mutex locks pthread_mutex_lock(&mutex); counter++; printf("%d\n", counter); sleep(1); pthread_mutex_unlock(&mutex); } while ( 1 ); } void reset_counter(void *p) { char buf[10]; int num = 0; int rc; pthread_mutex_lock(&mutex); // block mutex just to show message printf("Enter the number and press 'Enter' to initialize the counter with new value anytime.\n"); sleep(3); pthread_mutex_unlock(&mutex); // unblock blocked mutex so another thread may work do { if ( gets(buf) != buf ) return; // NO fool-protection ! Risk of overflow ! num = atoi(buf); if ( (rc = pthread_mutex_trylock(&mutex)) == EBUSY ) { printf("Mutex is already locked by another process.\nLet's lock mutex using pthread_mutex_lock().\n"); pthread_mutex_lock(&mutex); } else if ( rc == 0 ) { printf("WOW! You are on time! Congratulation!\n"); } else { printf("Error: %d\n", rc); return; } counter = num; printf("New value for counter is %d\n", counter); pthread_mutex_unlock(&mutex); } while ( 1 ); } int main(int argc, char ** argv) { pthread_t thread_1; pthread_t thread_2; counter = 0; pthread_create(&thread_1, NULL, (void *)&incr_counter, NULL); pthread_create(&thread_2, NULL, (void *)&reset_counter, NULL); pthread_join(thread_2, NULL); return 0; } 
[ рдбрд╛рдЙрдирд▓реЛрдб ]

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджреЛ рдереНрд░реЗрдб рдХреЗ рд╕рд╛рдЭрд╛рдХрд░рдг рдХреЛ рдПрдХ рд╕рд╛рдЭрд╛ рдЪрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдСрдЯреЛрдореИрдЯрд┐рдХ рдореЛрдб рдореЗрдВ рдПрдХ рдереНрд░реЗрдб (рдкрд╣рд▓рд╛ рдереНрд░реЗрдб) рд▓рдЧрд╛рддрд╛рд░ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдкреВрд░реЗ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓рд╛ рдзрд╛рдЧрд╛ рдХреЗрд╡рд▓ 10 рдорд┐рд▓реА рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЧрд┐рдирддреА рдЪрд░ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд▓реЗрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ, рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред

рдпрджрд┐ рд╣рдордиреЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рджреЛ рдзрд╛рд░рд╛рдПрдВ рдПрдХ рд╕рд╛рде рдПрдХреНрд╕реЗрд╕ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд╣рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди, pthread_mutex_lock () рдФрд░ pthread_mutex_trylock () рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдкрдХреЛ -lpreadread рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 $ gcc -o mutex -lpthread mutex.c 

рд╣рдо рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдорд╛рди рджрд░реНрдЬ рдХрд░рдХреЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдорд╛рди рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрджрд▓рддреЗ рд╣реИрдВ:
 $ ./mutex Enter the number and press 'Enter' to initialize the counter with new value anytime. 1 2 3 30 <Enter> <---    Mutex is already locked by another process. Let's lock mutex using pthread_mutex_lock(). New value for counter is 30 31 32 33 1 <Enter> <---    Mutex is already locked by another process. Let's lock mutex using pthread_mutex_lock(). New value for counter is 1 2 3 

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рдбреА-рдмрд╕ рдФрд░ рдЖрд░рдкреАрд╕реА рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред
рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

UPD: рд╕реЗрдорд╛рдлреЛрд░рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреАрд╕рд░рд╛ рдЕрдзреНрдпрд╛рдп рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЙрдк-рдЕрдзреНрдпрд╛рдп рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

Source: https://habr.com/ru/post/In122108/


All Articles