# 機能設計書 157-PID取得

## 概要

本ドキュメントは、libuvライブラリにおけるuv_os_getpid()/uv_os_getppid()関数による現在のプロセスID・親プロセスID取得機能の設計を記述する。

### 本機能の処理概要

uv_os_getpid()関数は現在のプロセスのPIDを、uv_os_getppid()関数は親プロセスのPIDをクロスプラットフォームで取得する機能を提供する。

**業務上の目的・背景**：プロセス識別はプロセス間通信、ログ出力、PIDファイル管理、プロセス監視など多くの場面で必要となる。POSIXのgetpid()/getppid()やWindowsのGetCurrentProcessId()を統一的にラップし、型安全なインターフェースを提供する。

**機能の利用シーン**：PIDファイルの作成、ログ出力時のプロセスID付与、デバッグ情報への埋め込み、プロセスの親子関係確認、ユニークなID生成の種としてのPID使用などに利用される。

**主要な処理内容**：
1. uv_os_getpid(): OSのgetpid()/GetCurrentProcessId()を呼び出してPIDを返す
2. uv_os_getppid(): OSのgetppid()/親プロセスID取得APIを呼び出してPPIDを返す

**関連システム・外部連携**：
- Unix: getpid()、getppid()システムコール
- Windows: GetCurrentProcessId()

**権限による制御**：特別な権限は不要。一般ユーザー権限で実行可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 29 | その他ユーティリティ | 主機能 | uv_os_getpid()/getppid()によるプロセスID取得のAPI定義 |

## 機能種別

データ取得処理（プロセスIDの読み取り）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| (なし) | - | - | 引数なし | - |

### 入力データソース

OSカーネルからプロセスID情報を取得する。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 (getpid) | uv_pid_t | 現在のプロセスのPID |
| 戻り値 (getppid) | uv_pid_t | 親プロセスのPID |

### 出力先

関数の戻り値として返す。

## 処理フロー

### 処理シーケンス

```
1. uv_os_getpid():
   ├─ [Unix] return getpid()
   └─ [Windows] return GetCurrentProcessId()

2. uv_os_getppid():
   ├─ [Unix] return getppid()
   └─ [Windows] pNtQueryInformationProcess(ProcessBasicInformation)で親PIDを取得
```

### フローチャート

```mermaid
flowchart TD
    A[uv_os_getpid] --> B{プラットフォーム}
    B -->|Unix| C[return getpid]
    B -->|Windows| D[return GetCurrentProcessId]

    E[uv_os_getppid] --> F{プラットフォーム}
    F -->|Unix| G[return getppid]
    F -->|Windows| H[NtQueryInformationProcess で親PID取得]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-157-01 | 常に成功 | Unix版はgetpid()/getppid()が常に成功するため、エラーを返さない | Unixプラットフォーム |
| BR-157-02 | 型統一 | 戻り値はuv_pid_t型で統一（Unix: pid_t、Windows: DWORD相当） | 常時 |

### 計算ロジック

特別な計算ロジックはない。

## データベース操作仕様

該当なし（データベース操作は行わない）。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| (なし) | - | getpid()/getppid()は常に成功する | - |

### リトライ仕様

リトライは不要。

## トランザクション仕様

該当なし。

## パフォーマンス要件

極めて軽量な処理であり即座に完了する。

## セキュリティ考慮事項

PID情報は一般的に機密情報ではないが、攻撃者がPIDを利用してプロセスを特定・操作する可能性がある。

## 備考

- uv_pid_tの実際の型はプラットフォームにより異なる（Unix: pid_t、Windows: int）。
- これらの関数はエラーを返さない。POSIXではgetpid()/getppid()は常に成功すると規定されている。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv.h | `include/uv.h` | uv_pid_t型定義、API宣言（1320-1321行目） |

**読解のコツ**: `uv_pid_t uv_os_getpid(void);` / `uv_pid_t uv_os_getppid(void);` - 引数なし、戻り値がPID。エラーコードを返さないシンプルなAPI。

#### Step 2: Unix実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | core.c | `src/unix/core.c` | uv_os_getpid()/uv_os_getppid()のUnix実装 |

**主要処理フロー**:
- **1666-1668行目**: `uv_os_getpid()` - `return getpid();`
- **1671-1673行目**: `uv_os_getppid()` - `return getppid();`

#### Step 3: Windows実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | util.c | `src/win/util.c` | Windows版uv_os_getpid()/uv_os_getppid()実装 |

**主要処理フロー**:
- **313-315行目**: `uv_os_getpid()` - `return GetCurrentProcessId();`
- **318-332行目**: `uv_os_getppid()` - `pNtQueryInformationProcess(GetCurrentProcess(), ProcessBasicInformation, ...)` で親PIDを取得
  - 成功時: `basic_info.InheritedFromUniqueProcessId` を返す
  - 失敗時: `-1` を返す

### プログラム呼び出し階層図

```
uv_os_getpid()
    +-- [Unix] getpid()
    +-- [Windows] GetCurrentProcessId()

uv_os_getppid()
    +-- [Unix] getppid()
    +-- [Windows] pNtQueryInformationProcess(ProcessBasicInformation)
            +-- basic_info.InheritedFromUniqueProcessId
```

### データフロー図

```
[入力]            [処理]                    [出力]

(なし) -------> uv_os_getpid()        ---> uv_pid_t (PID)
                +-- getpid() /
                    GetCurrentProcessId()

(なし) -------> uv_os_getppid()       ---> uv_pid_t (PPID)
                +-- getppid() /
                    NtQueryInformationProcess
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | uv_pid_t型定義、API宣言 |
| core.c | `src/unix/core.c` | ソース | Unix系uv_os_getpid()/uv_os_getppid()実装 |
| util.c | `src/win/util.c` | ソース | Windows版uv_os_getpid()/uv_os_getppid()実装 |
