質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

0回答

1685閲覧

Linux環境下のでセマフォ

Timosy

総合スコア3

セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/01/13 15:16

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argparse

2021/01/13 16:14

man semctl は御確認なさいましたか? `union semun` の型は利用者自ら明示的に定義せよと書かれているかと思います。
ockeghem

2021/01/13 23:36

サンプルコードの出典を追記してください。これがないと引用要件を満たさず、著作権侵害になります
Timosy

2021/01/14 01:47

失礼しました.「システムプログラミング入門:UNIXシステムコール,演習による理解」です. man semctlというものについて調べてみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問