#質問
Linux環境において2つのプログラム(プロセス)を用いてデータを送り,それを受信するというプログラムを書きました.
ですが「送信者が立て続けにメッセージを送信すると,受信者が受信に失敗する場合」や「送信者がしばらくメッセージを送信しない場合,受信者が同じメッセージを何度も受信してしまう場合」などがあります.
セマフォを使えばよいとのアドバイスを受けたのですがどうすればよいか分かりません.
どなたかコーディングを教えていただけないでしょうか.
#試したこと
以下は実際に作成したプログラム(セマフォによる排他制御は行っていないもの)です.
##send_by_shm.c
C
1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/ipc.h> 4#include <sys/shm.h> 5#include <stdlib.h> 6#include <string.h> 7 8int main (int argc, char *argv[]) 9{ 10 int id; 11 char *adr; 12 13 if (argc !=2) 14 { 15 fprintf(stderr, "Usage: send-by-shm <Shared memory ID>"); 16 exit (EXIT_FAILURE); 17 } 18 19 id=atoi(argv[1]); 20 if((int) (adr = (char *)shmat (id, (void *) 0, 0)) == -1) 21 { 22 perror("shmat"); 23 exit(EXIT_FAILURE); 24 } 25 else 26 { 27 while(1) 28 { 29 printf("Input any string>"); 30 fgets(adr, 512, stdin); 31 adr[strlen(adr)-1] = '\0'; 32 if(strcmp (adr, "quit") == 0) 33 break; 34 } 35 if (shmdt (adr) == -1) 36 { 37 perror("shmdt"); 38 exit (EXIT_FAILURE); 39 } 40 } 41} 42
##receive_by_shm.c
C
1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/ipc.h> 4#include <sys/shm.h> 5#include <stdlib.h> 6#include <string.h> 7 8#define BUFSIZE 512 9 10int main() 11{ 12 int id; 13 char *adr; 14 15 if ((id = shmget (IPC_PRIVATE, BUFSIZE, IPC_CREAT|0666)) == -1) 16 { 17 perror ("shmget"); 18 exit(EXIT_FAILURE); 19 } 20 printf("Shared memory ID =%d\n", id); 21 22 if ((int)(adr=(char *) shmat (id, (void *) 0, 0)) == -1) 23 { 24 perror ("shmat"); 25 shmctl(id, IPC_RMID, NULL); 26 exit (EXIT_FAILURE); 27 } 28 else 29 { 30 strcpy (adr, "Initial"); 31 while(1) 32 { 33 printf("%s\n", adr); 34 if (strcmp (adr, "quit") == 0) { 35 break; 36 } 37 sleep(3); 38 } 39 40 if (shmdt (adr) == -1) 41 { 42 perror("shmdt"); 43 shmctl(id, IPC_RMID, NULL); 44 exit (EXIT_FAILURE); 45 } 46 } 47 48 if(shmctl(id, IPC_RMID, NULL) == -1) 49 { 50 perror("chmctl"); 51 exit(EXIT_FAILURE); 52 } 53}
#実行結果
一度でいいメッセージを何度も受信してしまっている状況です.
Shared memory ID = 753669 Initial Initial Initial Initial Initial Initial Initial Initial Initial ...