0

P1 と P2 の 2 つのプロセスがあります。P1 はルートとして実行されており、次の呼び出しでセマフォを作成しています。

semget (キー、1、S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | IPC_CREAT);

通常のユーザーのコンテキストで実行されている別のプロセス P2 で同じセマフォへのハンドルを取得しようとしています。このプロセスでは、semget 呼び出しは成功しますが、semop 呼び出しは「アクセス許可が拒否されました」(Errno = 13) で失敗します。

どんなポインタでも大いに役立ちます。

~ps7

4

4 に答える 4

1

shmget() の 3 番目の引数として、S_IRUSR と S_IWUSR を使用して、共有メモリ セグメントの所有者の読み取りと書き込みのアクセス許可を指定し、S_IROTH と S_IWOTH を使用して、その他のフラグの読み取りと書き込みのアクセス許可を指定します。

IPC_CREATE は、キー値に対応する新しい共有メモリ セグメントが作成されることのみを保証します。通常、キー値で指定されたセグメントが存在する場合、shmget() は失敗します。

于 2009-10-08T13:04:00.077 に答える
1

もちろん、 「許可が拒否されました」/は、アクセスできない既存のセマフォを試みているEACCES非特権プロセスと一致しています。そのため、おそらくそのキーの下に、必要なアクセス許可がない既存のセマフォが存在する可能性があります。(おそらく初期バージョンの名残?)P2semgetS_IWOTH|S_IROTHP1

ipcs -sセマフォのパーミッションとは何ですか? で通話に追加IPC_EXCLするとどうなりますか? 失敗しますか?semgetP1

于 2009-08-12T03:19:02.180 に答える
1

このエントリは長いですが、私は同じ問題を抱えていました

0600 | IPC_CREAT

しかし、私はすでにsudoでアプリケーションを実行することを修正しました

于 2012-05-05T03:24:36.787 に答える
0

私たちが話している言語は何ですか?

S_ 定数のインポートに何らかのエラーがあると思われるため、それらは null であり、効果がありません。

ビットマスクをそのまま使ってブルートテストはどうでしょうか?直接使ってみるIPC_CREAT | 0666

私の2セント:)

于 2009-07-10T16:42:49.230 に答える