Linux環境でセマフォを使いたいと思い,下記のサンプルコードを実行しようと思ったのですが「inivalの記憶域が不明です」と言われ実行できません。
サンプルコードなので間違いはないはずなのですが,何か環境に不備があるのでしょうか?
#コード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <sys/types.h> 4#include <sys/ipc.h> 5#include <sys/shm.h> 6#include <sys/sem.h> 7 8int main (int argc, char *argv []) 9{ 10 int id, tmp , sid, i; 11 int *counter; 12 int num; 13 union semun inival; 14 struct sembuf semlock; 15 struct shmid_ds buf; 16 17 semlock.sem_num=0; 18 semlock.sem_flg=0; 19 20 printf("test"); 21 22 srand((unsigned) time (NULL)); 23 24 if (argc == 1) 25 { 26 if ((id = shmget (IPC_PRIVATE, sizeof (int), IPC_CREAT|0666)) == -1) 27 { 28 perror ("shmget"); 29 exit(EXIT_FAILURE); 30 } 31 if ((sid = semget (id, 1,IPC_CREAT | 0700)) == -1) 32 { 33 perror ("semget"); 34 exit (EXIT_FAILURE); 35 } 36 inival.val = 1; 37 semctl (sid, 0, SETVAL, inival); 38 printf("shared memory ID = %d\n", id); 39 } 40 else if (argc == 2) 41 { 42 id = atoi (argv[1]); 43 if((sid = semget (id, 1,0)) == -1) 44 { 45 perror ("semget"); 46 exit (EXIT_FAILURE); 47 } 48 } 49 printf ("Input the number to add. >"); 50 scanf ("%d", &num) ; 51 52 counter = (int *) shmat (id,0,0); 53 if (argc == 1) *counter = 0; 54 55 for (i = 0; i < 3; i++) 56 { 57 semlock.sem_num=0; 58 semlock.sem_op=-1; 59 semlock.sem_flg=0; 60 if (semop (sid, & semlock, 1) < 0) break; 61 /* セマフォを1減算(ロック) */ 62 tmp = *counter; 63 fprintf (stderr, "counter=%d", tmp); 64 sleep(rand()%4); 65 tmp += num; *counter = tmp; 66 semlock.sem_num=0; 67 semlock.sem_op=1; 68 semlock.sem_flg=0; 69 if (semop(sid, &semlock, 1) < 0) break; 70 /* セマフォを1加算 (アンロック) */ 71 fprintf (stderr," -> %d\n", *counter); 72 sleep(rand () % 4); 73 } 74 75 shmctl (id, IPC_STAT, &buf); 76 77 if (shmdt (counter) == -1) perror ("shmdt"); 78 if (buf.shm_nattch == 1) 79 { 80 if (shmctl (id, IPC_RMID,0) == -1) perror ("chmctl"); 81 } 82 83 if (semctl (sid,IPC_RMID,0) == -1) perror ("semctl") ; 84}
あなたの回答
tips
プレビュー