2012-10-11 18 views
6

pid_tタイプの最大値を移植可能にするにはどうすればよいですか?私のシステムにはPID_MAX定数はありません。pid_tの最大値はどのようにして決めることができますか?

(注、Iは、データ型ではなく、システムがプロセスに割り当てるデファクト最大値で許容される最大値を意味する。)

ユースケース: IはUSER-変換よpidの文字列指定をpid_tに渡し、ユーザーの入力が型の容量を超えないようにしたいと考えています。あなたのヘッダーの1つで

+3

があなたの目的のために 'sizeof'十分ではありませんか? (なぜあなたがそれを必要とするのか分かりませんが、詳しく教えてください) – Mat

+1

'/ proc/sys/kernel/pid_max'は編集可能な最大PIDを定義します。 –

+0

@ KingsIndian、ありがとう。タイプの最大値であり、実際にはシステムの最大値ではありません。 – pilcrow

答えて

2

POSIX (2008) says

blksize_t、pid_t、及びssize_tのは整数型を締結しなければなりません。

そして:

実装はblksize_t、pid_t、size_tの、ssize_tの、そして suseconds_tの幅が長いタイプの幅よりも大きくない た1つまたは複数のプログラミング環境をサポートしなければなりません。

だから、longに、ユーザの文字列を変換することができ、その後、long pid; .. pid == (pid_t)pidを使用してpid_tタイプのオーバーフローをチェック。

0

#ifndef PID_MAX 
#define PID_MAX INT_MAX // or whatever value you see fit 
#endif 

あなたは環境変数に基づいてサーバ/ OS依存の定義に基づいて、それをも行うことができます。

ルック: Similar post : Maximum PID in Linux

+0

ありがとう、@ SparKot。私はあなたの答えが先験的な*知っているかどうかは分かりません。 'pid_t'は' long'ではなく 'int'です。それとは別に、私はリンクされたポストが密接に関連しているとは思わない:私は、データ型の最大値ではなく、システムが割り当てられる最大値(より低い可能性がある)ではない。 – pilcrow

6

私は過去に時々やったことは、より大きなデータ型を使用し、私は私の小さな型に変換するときに、すぐに値をより大きな型に戻って変換していることを確認しています変更されませんでした。使用するために大規模なデータ・タイプのための偉大なオプションはありません

int64_t my_pid64; 

/* ... parse string value into my_pid64 ... */ 

pid_t my_pid = (pid_t) my_pid64; 
if ((int64_t) my_pid != my_pid64) /* check that value was not out of range of pid_t */ 
{ 
    /* ... handle error ... */ 
} 

:たとえば

、あなたはあなたのようなものを持っているかもしれませんが、代わりにint64_tのを使用言います。 "long"は、以前は最大のプリミティブ整数データ型でしたが、Linuxの場合でも、これは一般的なコンパイラ/アーキテクチャでは当てはまりません(下記のコメントを参照)。一方、intmax_t型はライブラリのサポートが不十分です。その結果、実際にはint64_tがより便利になることがあります。

しかし、基本的には、より大きなデータ型のオプションは、おそらくint64_tとintmax_tです。

+0

"それはまだLinux上にある" - x64用のLinux(ランクは同じだが、long longと同じサイズ)であるが、Linuxではx86用ではない(intと同じサイズ、long longより小さい) 。 –

+0

説明をありがとう – Steven

1

スティーブンの答えは良いアプローチです。

しかし、あなたが本当に未定義の動作に依存することなく、最大pid_t値を決定したい場合、私はあなたの最善の策だと思います:

#include <sys/types.h> 
#include <limits.h> 
#include <stdlib.h> 

static inline pid_t get_max_pid_t() 
{ 
    if (sizeof(pid_t) == sizeof(short)) return SHRT_MAX; 
    if (sizeof(pid_t) == sizeof(int)) return INT_MAX; 
    if (sizeof(pid_t) == sizeof(long)) return LONG_MAX; 
#if defined(LLONG_MAX) // C99 
    if (sizeof(pid_t) == sizeof(long long)) return LLONG_MAX; 
#endif 
    abort(); 
} 

POSIXはpid_tが符号付き整数型であることを保証します。このコードは、符号付き整数型のサイズがその型を一意に決定するものと想定しています。私はこれが素晴らしい仮定だと思うが、私は標準がそれを保証しているかどうか分からない。

まともなコンパイラは、これをすべてインライン展開し、すべてを非存在にするため、パフォーマンスは問題になりません。

(脇:C++では、あなたはstd::numeric_limits<pid_t>::max()を記述し、それを使って行うこと。)

関連する問題