#質問
共有メモリを確保して,2つのプログラムを用いてメッセージを送受信するシステムを考えていますが同じメッセージを何度も受信してしまうことがあり解決策をさがしています.
コーディングはLinuxです.
よい排他制御のコーディングの仕方などがあればお教えください.
#コード
###send.c
Linux
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.c
Linux
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} 54
#実行結果
bash-4.2$ gcc send.c bash-4.2$ ./a.out Usage: send <Shared memory ID>bash-4.2$ gcc receive.c bash-4.2$ ./a.out Shared memory ID = 753669 Initial Initial Initial Initial Initial Initial Initial Initial ...
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/16 04:03
2021/01/16 06:49
退会済みユーザー
2021/01/16 17:47