PID制御

静的のstd ::マップ< pid_t、TTask *>タスク。

 

テロTTask ::フォーク(ブールデタッチ){
PORTO_ASSERT(PostFork!)。
オートロック=のstd :: unique_lockの<はstd ::ミューテックス>(FORKLOCK)。
ForkTime =時間(NULL)。
localtime_r(&ForkTime、&ForkLocalTime)。
pid_t RET =フォーク()。
(RET <0)であれば
、戻りTERROR ::システム( "TTask ::フォーク");
PID = RET;
(!PID)であれば
真PostFork =;
それ以外の場合(デタッチ!)
タスク[PID] =この;
実行中=はtrue。
リターンOK。
}

テロTTask ::ウェイト(){
オートロック= STD :: unique_lockの<はstd ::ミューテックス>(FORKLOCK)。
{(実行)する場合
pid_t PID = PIDが。
int型のステータス。
施錠開錠();
/ *メインスレッドがロックでブロックすることができることを我々している保持* /
IF(waitpidの(PID、&ステータス、0)== PID)
PID = 0;
lock.lock();
(!PID){もし
あれば(実行){
Tasks.erase(PID)。
= falseを実行しています。
}
ステータス=ステータス。
}
}
(ランニング){ながら
IF(キル(PID、0)&&のerrno == ESRCH){
Tasks.erase(PID)。
= falseを実行しています。
ステータス= 100;
リターンTERROR(「タスクが見つかりません」)。
}
IF(Tasks.find(PID)== Tasks.end())
リターンTERROR( "タスクをデタッチ");
TasksCV.wait(ロック)。
}
(ステータス)の場合
、戻りTERROR(EError ::不明、FormatExitStatus(ステータス));
リターンOK。
}

 

おすすめ

転載: www.cnblogs.com/hshy/p/11964384.html