12.07.2015 Views

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

プロセス 間 同 期System Vセマフォの 利 用 51つのシステムコールは、セマフォの 集 合 において 一 連連 のこれらのブロッキング/ 非 ブロッキング操 作 を 実 行 するために 使 用 することが 可 能 です。 一 連連 の 操 作 を 実 行 する 時 、ブロッキング/ 非 ブロッキング 操 作 は 集 合 の 一 部邪 または 全 てのセマフォに 適遚 用 することが 可 能 です。また、 操 作 はセマフォの 数 のどんな 順 番 でも 適遚 用 することが 可 能 です。しかし、それらが 全 て 正 常 に 処 理 されるまでは 操 作 されません。 例 えば、もし10 個 のセマフォの 集 合 の6 個 の 処 理 のうち 最 初 の3 個 が 正 常 終了 し、4つ 目 の 操 作 でブロックされた 場 合 、6 個 の 操 作 全 てがブロック 無 しで 実 行 できるようになるまで、 集 合 に 対 して 変 更 を 行 うことはありません。 操 作 全 てが 成 功 およびセマフォが 変 更 のどちらか 一 方 、もしくは1つ 以 上 の( 非 ブロック) 操 作 が 失 敗 では、 何 も 変 更 されません。つまり、 操作 はアトミックに 実 行 されます。単 一 のセマフォもしくはセマフォの 集 合 のための 非 ブロック 操 作 のどのような 失 敗 も、 操 作 が 少しも 実 行 されずに 即 座 に 戻 る 原 因 となることを 思 い 出 してください。これが 発 生 した 時 、プロセスから-1が 返 され、 外 部邪 変 数 errnoにその 結 果 が 設 定 されます。システムコールはプロセスが 利 用 可 能 なこれらのセマフォ 機 能 を 構 成 します。 呼 び 出 し 元 プロセスシステムコールへ 引 数 を 渡 し、システムコールはその 機 能 を 実 行 して 成 功 もしくは 失 敗 のどちらか 一 方 となります。もしシステムコールが 成 功 する 場 合 、その 機 能 が 実 行 され 適遚 切 な 情 報 を 返します。そうではない 場 合 、プロセスから-1が 返 され、 外 部邪 変 数 errnoにその 結 果 が 設 定 されます。セマフォが 使 用 する( 実 行 するまたは 制 御 される) 前 に 一 意 に 識 別 されるデータ 構 造造 体 およびセマフォの 集 合 ( 配郤 列 )は 作 成 される 必 要 があります。ユニークな 識 別 子 はセマフォ 集 合 識 別 子 (semid)と 呼 ばれ、これは 特 定 のデータ 構 造造 体 やセマフォの 集 合 を 識 別 するため、もしくは 参 照 するために 使 用 されます。この 識 別 子 はシステム 内 のどのプロセスでもアクセス 可 能 で、 通 常 のアクセス制 限 事 項 の 対 象 となります。セマフォ 集 合 は 配郤 列 に 所 定 の 数 の 構 造造 体 を 含 みます( 集 合 中 のセマフォにつき1つの 構 造造 体 )。セマフォ 集 合 内 のセマフォの 数 (nsems)はユーザーが 遥 択 可 能 です。semop(2)システムコールで 使 用 されるsembuf 構 造造 体 を 図 5-1に 示 します。図 5-1 sembuf 構 造造 体 の 定 義struct sembuf {unsigned short int sem_num; /* semaphore number */short int sem_op; /* semaphore operation */short int sem_flg; /* operation flag */};sembuf 構 造造 体 はヘッダ・ファイル 内 に 定 義 されています。5-29

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!