pid 控制
static std::map<pid_t, TTask *> Tasks;
TError TTask::Fork(bool detach) {
PORTO_ASSERT(!PostFork);
auto lock = std::unique_lock<std::mutex>(ForkLock);
ForkTime = time(NULL);
localtime_r(&ForkTime, &ForkLocalTime);
pid_t ret = fork();
if (ret < 0)
return TError::System("TTask::Fork");
Pid = ret;
if (!Pid)
PostFork = true;
else if (!detach)
Tasks[Pid] = this;
Running = true;
return OK;
}
TError TTask::Wait() {
auto lock = std::unique_lock<std::mutex>(ForkLock);
if (Running) {
pid_t pid = Pid;
int status;
lock.unlock();
/* main thread could be blocked on lock that we're holding */
if (waitpid(pid, &status, 0) == pid)
pid = 0;
lock.lock();
if (!pid) {
if (Running) {
Tasks.erase(Pid);
Running = false;
}
Status = status;
}
}
while (Running) {
if (kill(Pid, 0) && errno == ESRCH) {
Tasks.erase(Pid);
Running = false;
Status = 100;
return TError("task not found");
}
if (Tasks.find(Pid) == Tasks.end())
return TError("detached task");
TasksCV.wait(lock);
}
if (Status)
return TError(EError::Unknown, FormatExitStatus(Status));
return OK;
}
最新文章
- 登陆+注册(三层+sql语句)
- 61-umask 简明笔记
- [转]浅谈jQuery EasyUI的属性设置
- 【转】随机函数的rand、srand用法
- Oracle表名、列名、约束名的长度限制
- ftp断点续传
- postgresql - mac 启动 关闭 postgresql
- 关于 python 的 @property总结和思考
- HDU3466Proud Merchants(贪心&;背包)
- iOS缓存框架-PINCache解读
- Ibatis学习记录
- 手把手教你如何使用webpack+react
- 如何设置App的启动图
- 微信小程序出现 Expecting &#39;STRING&#39;,&#39;NUMBER&#39;,&#39;NULL&#39;,&#39;TRUE&#39;,&#39;FALSE&#39;,&#39;{&#39;,&#39;[&#39;, got INVALID
- activeMQ (一)
- seq_file学习(1)—— single_open
- JAVA中的糕富帅技术——反射(一)
- 自制操作系统Antz -- 系列文章
- Centos kernel panic-not syncing:VFS:Unable to mount root fs on unknown block 解决办法
- [转]JVM参数设置、分析