在OJ里,编译是评测的第一步。
通常情况下,大家都是用bat文件加命令行进行编译的。但这里不好控制时间。如果用一个线程去监控这个编译进程,进程结束就下一步的话,未免有点小题大做了。
我采用的是下面一种“文件锁”的方法:
在创建bat文件的同时创建一个“文件锁”文件,如”.lock”。
然后在bat文件的最后一行加入一句”del .lock”即可。而在程序中你只要在运行bat之后来一句
while(0 == access(“.lock”, 0));
这样就可以做到延时了。等到文件锁被删除之后,就表示文件编译完成。
当然,有可能编译时间过久,那这里也可以从while下文章,加一个条件,如果时间到了,则删掉这个进程即可。
下面是部分的实现代码:
- /** 这段代码就是生成bat文件的代码 */
- bool NCompiler::MakeBat(const char *cmd)
- {
- FILE *fp;
- FILE *lock; ///< 编译锁文件
- if(NULL == (fp = fopen(BAT_FILENAME, "w+")) ||
- NULL == (lock = fopen(LOCK_FILENAME, "w+")))
- {
- fclose(fp);
- fclose(lock);
- return false;
- }
- /** 输出编译命令 */
- fprintf(fp, "%s", cmd);
- /** 测试编译锁时的延时指令 */
- //fprintf(fp, "ping 127.0.0.1/n");
- /** 输出删除编译锁命令 */
- fprintf(fp, "del %s/n", LOCK_FILENAME);
- fclose(fp);
- fclose(lock);
- return true;
- }