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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

3103閲覧

sem_openの第4引数について

ap2c9w

総合スコア40

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/09 05:59

sem_openの第4引数についてmanには
The value argument specifies the initial value for the new semaphore.
と記載がありますが、valueがどのような意味をもつvalueなのかをご教示ください。

以下のようにsem_openの第4引数を2とした場合、sem_postを2回実施している状態で初期化すると思い以下のようなプログラムを書いて実行してみたのですが、sem_waitのところで止まってしまいます。2回分のsem_postがあるので、sem_waitでとまらない想定でした。

c

1#include <semaphore.h> 2#include <inttypes.h> 3#include <stdio.h> 4#include <unistd.h> 5#include <fcntl.h> 6 7// gcc -pthread -g semaphore_test.c 8 9sem_t *sem; 10 11int main(void) 12{ 13 sem = sem_open("sem", O_CREAT, 0600, 2); 14 //sem_post(sem); 15 //sem_post(sem); 16 sem_wait(sem); 17 sem_wait(sem); 18 sem_close(sem); 19 sem_unlink("sem"); 20 return (0); 21}

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あなたの提示された状態だとすると、(sem_postは2か所ともコメントアウト状態)
最初のセマフォの値は2
2回目のsem_waitが終わった状態で、セマフォの値は0になります。
従って、sem_waitで止まることはないと思いますが。
こちらでは、止まらずに、最後まで実行されました。
基本的な流れは同じですが、こちらで、多少手を加えています。
centos7.5
gccバージョン
スレッドモデル: posix
バージョン 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
で確認しました。

C

1#include <semaphore.h> 2#include <inttypes.h> 3#include <stdio.h> 4#include <unistd.h> 5#include <fcntl.h> 6#include <errno.h> 7// gcc -pthread -g semaphore_test.c 8 9sem_t *sem; 10 11int main(void) 12{ 13 int val; 14 int ret; 15 sem = sem_open("sem", O_CREAT, 0600, 2); 16 if (sem == SEM_FAILED){ 17 printf("sem_open fail errno=%d\n",errno); 18 return 10; 19 } 20 //sem_post(sem); 21 //sem_post(sem); 22 ret = sem_getvalue(sem,&val); 23 if (ret !=0){ 24 printf("sem_getvalue fail errno=%d\n",errno); 25 return 10; 26 } 27 printf("sem value=%d\n",val); 28 printf("test1\n"); 29 sem_wait(sem); 30 printf("test2\n"); 31 sem_wait(sem); 32 printf("test3\n"); 33 ret = sem_getvalue(sem,&val); 34 if (ret !=0){ 35 printf("sem_getvalue fail errno=%d\n",errno); 36 return 10; 37 } 38 printf("sem value=%d\n",val); 39 sem_close(sem); 40 printf("test4\n"); 41 sem_unlink("sem"); 42 printf("test5\n"); 43 return (0); 44} 45

実行結果
sem value=2
test1
test2
test3
sem value=0
test4
test5

投稿2020/11/09 10:11

編集2020/11/09 10:14
tatsu99

総合スコア5493

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

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

ap2c9w

2020/11/09 12:25

回答ありがとうございます! 結論から書くと、/dev/shm/sem.semを削除し、再度実行ファイルを実行することで所望の結果が得られました。 頂いた回答でプログラムソースには問題がないことが分かりましたので別の問題があると思い、/dev/shm/を確認したところ、sem.semがありましたので、これが悪さをしていると思い削除いたしました。 ソースの最初に sem_unlink("sem"); を追加することで、この問題を防げると思いましたので、そのようにするつもりです。
guest

0

投稿2020/11/09 06:17

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問