日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトル
目次
まえがき
リファレンス・セクション
   ≫ライブラリ関数一覧
索引
PDF
OpenVMS ホーム

HP OpenVMS
HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)


目次 索引




セマフォセット内のセマフォに対して操作を実行します。

形式

#include <sem.h>

int semop (int semid, struct sembuf *sops, size_t nsops);


引数



semid

セマフォセット識別子。

sops

セマフォ操作 ( sembuf) 構造体のユーザ定義の配列に対するポインタ。

nsops

sops配列における sembuf構造体の数。

説明

semop関数は,semid で指定したセマフォセット内のセマフォに対して操作を実行します。これらの操作は,sops で指定されたセマフォ操作 sembuf構造体のユーザ定義の配列で提供されます。各 sembuf構造体には以下のメンバ変数が含まれています。

struct sembuf {            /* semaphore operation structure */ 
  unsigned short sem_num;  /* semaphore number */ 
           short sem_op;   /* semaphore operation */ 
           short sem_flg;  /* operation flags SEM_UNDO and IPC_NOWAIT */ 

sem_op 変数で指定された各セマフォ操作は, semid 関数引数と sem_num 変数で指定される対応するセマフォに対して実行されます。

sem_op 変数は,次の 3 つのセマフォ操作のいずれかを指定します。

  1. sem_op が負の整数で呼び出しプロセスが変更権限を持っている場合,次のいずれかが発生します。

    • semval (see <sem.h>) が sem_op の絶対値と同じかそれ以上の場合, sem_op の絶対値は semval から差し引かれます。また,(sem_flg &SEM_UNDO) がゼロ以外の場合, sem_op の絶対値は指定したセマフォの呼び出しプロセスの semadj 値に追加されます。

    • semvalsem_op の絶対値より少なく (sem_flg &IPC_NOWAIT) がゼロでない場合, semopはすぐに値を返します。

    • semvalsem_op の絶対値よりも小さく (sem_flg &IPC_NOWAIT) が 0 の場合, semopは指定されたセマフォに関連する semncnt を増やし,次のいずれかの状況になるまでスレッド呼び出しの実行を中断します。

      • semval の値が sem_op の絶対値と同じか大きくなる。この場合,指定されたセマフォに対応する semncnt の値は減少し, (sem_flg &SEM_UNDO) がゼロ以外の場合 sem_op の絶対値が semval から差し引かれ,指定されたセマフォに対する呼び出しプロセスの semadj 値に sem_op の絶対値が追加されます。

      • 呼び出しスレッドがアクションを待つために使用している semid が,システムから削除される。この状況が発生した場合, errnoに EIDRM が設定され, - 1 が返されます。

      • 呼び出しスレッドが捕捉すべきシグナルを受け取る。この状況が発生すると,指定されたセマフォに対応する semncnt の値は減少し,呼び出しスレッドは sigactionに規定された方法で実行を再開します。

  2. sem_op が正の整数で呼び出しプロセスが変更権限を持っている場合, sem_op の値が semval に追加され, (sem_flg &SEM_UNDO) がゼロ以外の場合,指定されたセマフォの呼び出しプロセスの semadj 値から sem_op の値が差し引かれます。

  3. sem_op が 0 で呼び出しプロセスが読み取り権限を持っている場合,次のいずれかの状態になります。

    • semval が 0 の場合, semopはすぐに値を返します。

    • semval がゼロ以外で (sem_flg &IPC_NOWAIT) がゼロでない場合, semopはすぐに値を返します。

    • semval がゼロ以外で (sem_flg &IPC_NOWAIT) が 0 の場合, semopは,指定されたセマフォに関連する semzcnt を増加させ,次のいずれかの状況になるまで呼び出しスレッドの実行を中断します。

      • semval の値が 0 になる。その際,指定されたセマフォに対応する semzcnt が減少します。

      • 呼び出しスレッドがアクションを待つために使用している semid が,システムから削除される。この状況が発生した場合, errnoに EIDRM が設定され, - 1 が返されます。

      • 呼び出しスレッドが捕捉すべきシグナルを受け取る。この状況が発生した場合,指定されたセマフォに対応する semzcnt の値は減少し, sigactionに規定されている方法で呼び出しスレッドの実行が再開されます。

正常終了すると, sops によって示されている配列で指定されている各セマフォの値は,呼び出しプロセスのプロセス ID と同じ値に設定されます。


戻り値

0 正常終了
- 1 エラーの発生を示します。関数は errno に次のいずれかの値を設定します。

  • E2BIG -- nsops の値がシステムの上限値を超えています。

  • EACCES -- 呼び出しプロセスの操作権限が拒否されました。

  • EAGAIN -- 呼び出しプロセスの操作が停止されましたが,( sem_flg &IPC_NOWAIT) はゼロです。

  • EFAULT -- 関数に渡された引数にアクセスできません。

  • EFBIG -- sem_num の値が 0 あるいは semid. に対応するセマフォセットのセマフォ数と同じかそれを超えています。以上です。

  • EIDRM -- セマフォ識別子 semid がシステムから削除されました。

  • EINVAL -- semid の値が有効なセマフォ識別子ではありません。あるいは,呼び出しプロセスが要求する SEM_UNDO に対する個々のセマフォ数がシステム制限を超えています。

  • EVMSERR -- 変換不可能な OpenVMS エラー


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項