ãã®èšäºã§ã¯ã3çš®é¡ã®IPCã®ã¿ãæ€èšããŸãã
äœè«ïŒãã®èšäºã¯æè²çãªãã®ã§ããããŸã ã·ã¹ãã ããã°ã©ãã³ã°ã®éãæ©ãã§ãã人ã ã察象ãšããŠããŸãã ãã®äž»ãªã¢ã€ãã¢ã¯ãPOSIXäºæOSäžã®ããã»ã¹éã®ããŸããŸãªããåãæ¹æ³ã«ç²Ÿéããããšã§ãã
ååä»ããã€ã
ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ããœã±ããããã£ãã«ãDãã¹ãããã³ãã®ä»ã®æè¡ã®ã¡ã«ããºã ã䜿çšã§ããŸãã é ã ã«ãããœã±ããã«ã€ããŠèªãã ããD-busã«é¢ããå¥ã®èšäºãæžãããããããšãã§ããŸãã ãã®ãããç§ã¯POSIXèŠæ Œã«é©åããäœé³æè¡ã«å°å¿µããå®äŸã玹ä»ããããšã«ããŸããã
ååä»ããã€ããä»ããŠã¡ãã»ãŒãžãæž¡ãããšãæ€èšããŠãã ããã æŠç¥çã«ã転éã¯æ¬¡ã®ããã«ãªããŸãã

ååä»ããã€ããäœæããã«ã¯ãé¢æ°mkfifoïŒïŒã䜿çšããŸãã
#include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
ãã®é¢æ°ã¯pathnameãšããååã®ç¹å¥ãªFIFOãã¡ã€ã«ãäœæãã modeãã©ã¡ãŒã¿ãŒã¯ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹æš©ãèšå®ããŸãã
æ³šïŒ mode㯠ã次ã®ããã«çŸåšã®umaskå€ãšçµã¿åãããŠäœ¿çšââãããŸãïŒ ïŒ mode ïŒãumaskïŒ ã ãã®æäœã®çµæã¯ãäœæãããã¡ã€ã«ã®æ°ããumaskå€ã«ãªããŸãã ãã®ããã0777ïŒ S_IRWXO | S_IRWXG | S_IRWXU ïŒã䜿çšããŠãçŸåšã®ãã¹ã¯ã®1ããããäžæžãããŸããã
ãã¡ã€ã«ãäœæããããšãéåžžã®ãã¡ã€ã«ãšåæ§ã«ãã©ã®ããã»ã¹ã§ããã®ãã¡ã€ã«ãèªã¿åããŸãã¯æžã蟌ã¿çšã«éãããšãã§ããŸãã ãã ãããã¡ã€ã«ãæ£ãã䜿çšããã«ã¯ã2ã€ã®ããã»ã¹/ã¹ã¬ããã§åæã«éãå¿ èŠããããŸãã1ã€ã¯ããŒã¿ã®åä¿¡ïŒãã¡ã€ã«ã®èªã¿åãïŒã§ããã1ã€ã¯è»¢éïŒãã¡ã€ã«ã®æžã蟌ã¿ïŒã§ãã
FIFOãã¡ã€ã«ãæ£åžžã«äœæããããšã mkfifoïŒïŒã¯0ïŒãŒãïŒãè¿ããŸãã ãšã©ãŒãçºçããå Žåãé¢æ°ã¯-1ãè¿ã ããšã©ãŒã³ãŒããerrnoå€æ°ã«èšå®ããŸãã
ãã£ãã«ã®äœæäžã«çºçããå žåçãªãšã©ãŒïŒ
- EACCES- ãã¹å pathã®ããããã®ãã£ã¬ã¯ããªã§å®è¡ïŒå®è¡ïŒããæš©éããããŸãã
- EEXIST-ãã¡ã€ã«ãã·ã³ããªãã¯ãªã³ã¯ã§ãã£ãŠãã ãã¹åãã¡ã€ã«ã¯æ¢ã«ååšããŸã
- ENOENT - pathnameã«èšèŒãããŠãããã£ã¬ã¯ããªãååšããªããããªã³ã¯ãå£ããŠããŸã
- ENOSPC-æ°ãããã¡ã€ã«ãäœæããã¹ããŒã¹ããããŸãã
- ENOTDIR- ãã¹åã«èšèŒãããŠãããã£ã¬ã¯ããªã®1ã€ãå®éã«ã¯1ã€ã§ã¯ãããŸãã
- EROFS-èªã¿åãå°çšãã¡ã€ã«ã·ã¹ãã ã§FIFOãã¡ã€ã«ãäœæããããšããè©Šã¿
äŸ
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 ïŒã ãŸããFIFOãã¡ã€ã«å°çšã«èšèšãããO_NONBLOCK修食åã䜿çšããŠããã¡ã€ã«ãæžã蟌ã¿çšã«éããããšãã«åŸ æ©ããªãããã«ããããšãã§ããŸãã ããããäžèšã®ã³ãŒãã§ã¯ããã®ã¡ãœããã¯äžäŸ¿ã§ãã
ããã°ã©ã ãã³ã³ãã€ã«ããŠããå®è¡ããŸãã
$ 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
å ±æã¡ã¢ãª
次ã®ã¿ã€ãã®ããã»ã¹ééä¿¡ã¯å ±æã¡ã¢ãªã§ãã æŠç¥çã«ã¯ã2ã€ã®ããã»ã¹ã«ãã£ãŠåæã«ã¢ã¯ã»ã¹ãããã¡ã¢ãªå ã®ç¹å®ã®ååä»ãé åãšããŠè¡šç€ºããŸãã

å ±æã¡ã¢ãªãå²ãåœãŠãã«ã¯ãPOSIX shm_openïŒïŒé¢æ°ã䜿çšããŸãã
#include <sys/mman.h> int shm_open(const char *name, int oflag, mode_t mode);
ãã®é¢æ°ã¯ãã¡ã¢ãªãªããžã§ã¯ãã«é¢é£ä»ããããŠãããã¡ã€ã«èšè¿°åãè¿ããŸãã ãã®èšè¿°åã¯ãåŸã§ä»ã®é¢æ°ïŒããšãã°ã mmapïŒïŒãŸãã¯mprotectïŒïŒ ïŒã§äœ¿çšã§ããŸãã
ãªããžã§ã¯ããåæ/åé€ããããŸã§ïŒ shm_unlinkïŒïŒ ïŒãã¡ã¢ãªãªããžã§ã¯ãã®å®å šæ§ã¯ãããã«é¢é£ä»ããããŠãããã¹ãŠã®ããŒã¿ãå«ããŠä¿æãããŸãã ããã¯ãããããã®ããã»ã¹ã§shm_unlinkïŒïŒãæ瀺çã«åŒã³åºããŸã§ãã©ã®ããã»ã¹ãïŒååãç¥ã£ãŠããã°ïŒã¡ã¢ãªãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãã
oflagå€æ°ã¯ã次ã®ãã©ã°ã®ãããåäœã®ORã§ãã
- O_RDONLY-èªã¿åãã¢ã¯ã»ã¹ã®ã¿ã§éã
- O_RDWR-èªã¿åãããã³æžã蟌ã¿æš©éã§éã
- O_CREAT-ãªããžã§ã¯ããæ¢ã«ååšããå Žåããã©ã°ã®å¹æã¯ãããŸããã ããã§ãªãå Žåã¯ããªããžã§ã¯ããäœæãããã¢ãŒãã«åŸã£ãŠã¢ã¯ã»ã¹æš©ãèšå®ãããŸãã
- O_EXCL-ãã®ãã©ã°ãO_CREATEãšçµã¿åãããŠèšå®ãããšãå ±æã¡ã¢ãªã»ã°ã¡ã³ããæ¢ã«ååšããå Žåãshm_opené¢æ°ã¯ãšã©ãŒãè¿ããŸãã
å ±æã¡ã¢ãªãªããžã§ã¯ããäœæããåŸã 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
ããã°ã©ã ã§createåŒæ°ã䜿çšããŠãå ±æã¡ã¢ãªã®äœæãšãã®å 容ã®å€æŽã®äž¡æ¹ãè¡ããŸãã
ã¡ã¢ãªãªããžã§ã¯ãã®ååãç¥ã£ãŠããã°ãå ±æã¡ã¢ãªã®å 容ãå€æŽã§ããŸãã ãããã äžåºŠshm_unlinkïŒïŒãåŒã³åºããšãã¡ã¢ãªã¯äœ¿çšã§ããªããªãã O_CREATEãã©ã¡ãŒã¿ãŒãªãã§shm_openïŒïŒã¯ãNo such file or directoryããšãããšã©ãŒãè¿ããŸãã
ã»ããã©
ã»ããã©ã¯ãã¹ã¬ãããåæããè€æ°ã®ã¹ã¬ãã/ããã»ã¹ã®å ±æã¡ã¢ãªïŒã°ããŒãã«å€æ°ãªã©ïŒãžã®åæã¢ã¯ã»ã¹ãå¶åŸ¡ããããã«æãäžè¬çã«äœ¿çšãããæ¹æ³ã§ãã ã»ããã©ã®å Žåã®ããã»ã¹éã®çžäºäœçšã¯ãããã»ã¹ãåãããŒã¿ã»ããã§åäœãããã®ããŒã¿ã«å¿ããŠåäœã調æŽããããšã§ãã
ã»ããã©ã«ã¯2ã€ã®ã¿ã€ãããããŸãã
- ã«ãŠã³ã¿ïŒã»ããã©ãã«ãŠã³ãïŒãåããã»ããã©ãããã¯ããããã«ã¢ã¯ã»ã¹ããããã»ã¹ã®ãªãœãŒã¹ã®å¶éã決å®ããŸãã
- 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å¶åŸ¡ãã©ã°ãæž¡ãããŸãã æ¢åã®ã»ããã©ã®äœ¿çšãéå§ããã«ã¯ã oflagã¯ãŒãã§ãã O_EXCLãã©ã°ãO_CREATEãã©ã°ãšäžç·ã«æž¡ãããå Žåãæå®ãããååã®ã»ããã©ãæ¢ã«ååšããå Žåã sem_openïŒïŒé¢æ°ã¯ãšã©ãŒãè¿ããŸãã
modeãã©ã¡ãŒã¿ãŒã¯ãåã®ç« ã§èª¬æããã®ãšåãæ¹æ³ã§èš±å¯ãèšå®ããŸãã ãããŠã å€å€æ°ã¯ã»ããã©ã®åæå€ãåæåããŸãã æå®ãããååã®ã»ããã©ãæ¢ã«ååšãã sem_openïŒïŒã O_CREATEãã©ã°ãšãšãã«åŒã³åºãããå Žåã ã¢ãŒããã©ã¡ãŒã¿ãšå€ãã©ã¡ãŒã¿ã®äž¡æ¹ã¯ç¡èŠãããŸãã
æ¢åã®ã»ããã©ããã°ããéãã«ã¯ã次ã®æ§é ã䜿çšããŸãã
#include <semaphore.h> sem_t *sem_open(const char *name, int oflag);
ã»ããã©åãšå¶åŸ¡ãã©ã°ã®ã¿ã瀺ãããŠããŸãã
ã«ãŠã³ã¿ãŒã䜿çšããã»ããã©ã®äŸ
ã»ããã©ã䜿çšããŠããã»ã¹ãåæããäŸãèããŠã¿ãŸãããã ãã®äŸã§ã¯ã1ã€ã®ããã»ã¹ãã»ããã©ã®å€ãå¢ãããããã«å®è¡ãç¶ããããã«2çªç®ã®ããã»ã¹ãããããªã»ããããã®ãåŸ ã¡ãŸãã
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; }
[ ããŠã³ããŒã ]
1ã€ã®ã³ã³ãœãŒã«ã§ã次ãå®è¡ããŸãã
$ ./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é¢æ°ã䜿çšããããã€ããªã»ããã©ã®ä»£ããã«ããã¥ãŒããã¯ã¹ãšåŒã°ããããäžè¬çã«äœ¿çšãããã»ããã©ãæ€èšããŸãã
ãã¥ãŒããã¯ã¹ã¯ããã€ããªã»ããã©ïŒã€ãŸããããžãŒç¶æ ãšããžãŒç¶æ ã§ã¯ãªã2ã€ã®ç¶æ ãæã€ã»ããã©ïŒãšæ¬è³ªçã«åãã§ãã ãã ãããmutexããšããçšèªã¯ã2ã€ã®ããã»ã¹ãå ±æããŒã¿/å€æ°ãåæã«äœ¿çšããªãããã«ä¿è·ããã¹ããŒã ã説æããããã«ãã䜿çšãããŸãã ããã€ããªã»ããã©ããšããçšèªã¯ãåäžã®ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶éããæ§é ã説æããããã«ãã䜿çšãããŸãã ã€ãŸãã1ã€ã®ããã»ã¹ãã»ããã©ããå æãããä»ã®ããã»ã¹ãã»ããã©ãã解æŸããããã€ããªã»ããã©ã䜿çšãããŸãã ãã¥ãŒããã¯ã¹ã¯ããããå æããŠããåãããã»ã¹/ã¹ã¬ããã«ãã£ãŠè§£æŸãããŸãã
ããšãã°ãå€ãã®ã¯ã©ã€ã¢ã³ããã¢ã¯ã»ã¹ã§ããããŒã¿ããŒã¹ãªã©ããã¥ãŒããã¯ã¹ã䜿çšããã«èšè¿°ããããšã¯äžå¯èœã§ãã
ãã¥ãŒããã¯ã¹ã䜿çšããã«ã¯ãpthread_mutex_initïŒïŒé¢æ°ãåŒã³åºãå¿ èŠããããŸãã
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
ãã®é¢æ°ã¯ã mutexattrå±æ§ã䜿çšããŠmutexïŒå€æ°mutex ïŒãåæåããŸãã mutexattrãNULLã®å Žåãmutexã¯ããã©ã«ãå€ã«åæåãããŸãã é¢æ°ãæåããå ŽåïŒæ»ãã³ãŒã0ïŒãmutexã¯åæåããããããªãŒãã§ãããšèŠãªãããŸãã
çºçããå¯èœæ§ã®ããå žåçãªãšã©ãŒïŒ
- EAGAIN-ãã¥ãŒããã¯ã¹ãåæåããã®ã«ååãªãªãœãŒã¹ïŒã¡ã¢ãªãé€ãïŒ
- ENOMEM-ååãªã¡ã¢ãªããããŸãã
- EPERM-æäœãå®è¡ããæš©éããããŸãã
- EBUSY-æ¢ã«åæåãããŠããããç Žå£ãããŠããªããã¥ãŒããã¯ã¹ãåæåããè©Šã¿
- EINVAL - mutexattrå€ãç¡å¹ã§ã
int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);
mutexããŸã ããžãŒã§ãªãå Žåã pthread_mutex_lockïŒïŒé¢æ°ã¯ãããååŸã ãææè ã«ãªããããã«çµäºããŸãã ãã¥ãŒããã¯ã¹ãããžãŒã®å Žåãããã»ã¹ã®ãããªãå®è¡ããããã¯ãããã¥ãŒããã¯ã¹ã解æŸãããã®ãåŸ ã¡ãŸãã
pthread_mutex_trylockïŒïŒé¢æ°ã®åäœã¯ã pthread_mutex_lockïŒïŒé¢æ°ãšåãã§ããã1ã€ã®äŸå€ããããŸãã ãã¥ãŒããã¯ã¹ãããžãŒã®å Žåã¯ããã»ã¹ããããã¯ããã EBUSYã³ãŒããè¿ããŸãã
pthread_mutex_unlockïŒïŒé¢æ°ã¯ãããžãŒãªãã¥ãŒããã¯ã¹ã解æŸããŸãã
pthread_mutex_lockïŒïŒã®ãªã¿ãŒã³ã³ãŒãïŒ
- EINVAL-ãã¥ãŒããã¯ã¹ãæ£ããåæåãããŠããŸãã
- EDEADLK-ãã¥ãŒããã¯ã¹ã¯çŸåšã®ããã»ã¹ã§ãã§ã«äœ¿çšãããŠããŸãã
- EBUSY-ãã¥ãŒããã¯ã¹ã¯ãã§ã«äœ¿çšãããŠããŸã
- EINVAL-ãã¥ãŒããã¯ã¹ãæ£ããåæåãããŠããŸãã
- EINVAL-ãã¥ãŒããã¯ã¹ãæ£ããåæåãããŠããŸãã
- EPERM-åŒã³åºãããã»ã¹ã¯ãã¥ãŒããã¯ã¹ã®ææè ã§ã¯ãããŸãã
ãã¥ãŒããã¯ã¹ã®äŸ
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; }
[ ããŠã³ããŒã ]
ãã®äŸã¯ãå ±æå€æ°ãžã®2ã€ã®ã¹ã¬ããã®å ±æã瀺ããŠããŸãã èªåã¢ãŒãã®1ã€ã®ã¹ã¬ããïŒæåã®ã¹ã¬ããïŒã¯ã ã«ãŠã³ã¿ãŒå€æ°ãåžžã«1ãã€å¢ãããªããããã®å€æ°ã1ç§éå æããŸãã ãã®æåã®ã¹ã¬ããã¯ã10ããªç§ã ãã«ãŠã³ãå€æ°ãžã®2åç®ã®ã¢ã¯ã»ã¹ãèš±å¯ããŠãããåã³1ç§ããããŸãã 2çªç®ã®ã¹ã¬ããã§ã¯ã端æ«ããå€æ°ã®æ°ããå€ãå ¥åããããšãææ¡ãããŠããŸãã
ãã¥ãŒããã¯ã¹ãã¯ãããžã䜿çšããŠããªãã£ãå Žåã2ã€ã®ã¹ããªãŒã ã«åæã«ã¢ã¯ã»ã¹ããŠããéãã°ããŒãã«å€æ°ã«ã©ã®å€ãå«ãŸãããã¯ããããŸããã ãŸããèµ·åæã«ã pthread_mutex_lockïŒïŒãšpthread_mutex_trylockïŒïŒã®éããæããã«ãªããŸãã
-lpthreadè¿œå ãã©ã¡ãŒã¿ãŒã䜿çšããŠã³ãŒããã³ã³ãã€ã«ããå¿ èŠããããŸãã
$ 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
çµè«ã®ä»£ããã«
次ã®èšäºã§ã¯ãd-busããã³RPCãã¯ãããžãŒã«ã€ããŠèª¬æããŸãã èå³ã®ããæ¹ã¯ãç¥ãããã ããã
ããããšã
UPDïŒã»ããã©ã«é¢ãã第3ç« ãæŽæ°ããŸããã ãã¥ãŒããã¯ã¹ã«é¢ãããµããã£ãã¿ãŒãè¿œå ããŸããã