fork实现system的定时退出问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

fork实现system的定时退出问题

2016-06-22 15:48:57 1936 1
enum stats {OK,TLE,RE};
struct runstats{
    stats stat;
    int exitcode;
};
runstats system_tle(const char* tor,int tle){
  runstats result;
  auto Start=std::chrono::steady_clock::now();
  pid_t p1=fork();
  if (p1==0){
    int ec=std::system(tor);
    if (ec) result.stat=RE; else result.stat=OK;
    result.exitcode=ec;
  }else{
    bool done=false;
    while (std::chrono::steady_clock::now()<Start+std::chrono::milliseconds(tle*1000)&&!done)
      if (kill(p1,0)!=0) done=true;
    if (!done){
      kill(p1,SIGKILL);
      result.stat=TLE;
      result.exitcode=-1;
    }else exit(0);
  }
  return result;
}

我想用这段代码实现system函数的定时,也就是system在指定时间内不退出,用另外一个进程kill之。但以上这段代码为什么会出现问题?问题大概是这样的,无论子进程是否在规定时间内跑完,主线程都会执行一次kill并返回错误的结果。

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:45:41

    因你的目的描述不是很清楚,我只能猜测,你的意图是: system(tor)调用可能会一直阻塞或长时间阻塞,如果它在规定时间内还没执行完,就kill之?

    在得到你确认之前,我先不回答这个问题。看了你的代码,先说两个严重问题。

    第一,父子进程有各自的数据内存空间。linux使用了copy on write技术,fork后子进程会与父进程共享数据,但一旦子进程修改数据,就会copy一份出来。就如代码中的result,子进程一份,父进程一份,各不相干。你代码的写法,把多进程当多线程来写了!

    第二,kill主进程pid即向主进程发信号,通常主进程在多进程里是进程组组长,组长及组内所有的子进程都会收到信号,包括system函数执行的程序也是属于子进程,除非被system执行的进程自己改变了进程组id。这个SIGKILL一发出,相当于所有进程包括子进程都会被强行杀掉,这种情况下程序内部根本无法进行什么逻辑判断和处理,整个程序就属于异常退出状态?

    0 0
相关问答

1

回答

遇到‘int[int]’ for array subscript解决?c报错

2020-05-27 17:23:26 652浏览量 回答数 1

0

回答

最近支付退款,出现了比较多,返回【aop.ACQ.SYSTEM_ERROR】的问题

2019-09-27 19:02:23 2480浏览量 回答数 0

1

回答

在gem / submodule中使用capistrano运行`rails db:migrate`

2019-04-09 17:11:25 2370浏览量 回答数 1

1

回答

invalid byte sequence for encoding "UTF8": 0x81

2019-03-09 20:22:50 3125浏览量 回答数 1

1

回答

80端口被system占用

2018-12-07 18:22:21 406浏览量 回答数 1

0

回答

Opencrypto-Unchaining-The-JavaCard-Ecosystem

2018-06-25 22:33:26 712浏览量 回答数 0

0

回答

JavaScript-SDK之如何实现静态网站托管?

2017-10-19 09:47:44 1658浏览量 回答数 0

0

回答

Ruby-SDK之如何实现静态网站托管?

2017-10-19 14:01:27 1726浏览量 回答数 0

1

回答

Algo Job Failed-System Error-Failed to execute system command

2017-09-29 18:32:49 4789浏览量 回答数 1

1

回答

无法将类型为“System.Int32”的对象强制转换为类型“System.Array”

2016-06-07 14:41:15 2920浏览量 回答数 1
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载