您的位置:首页 > 其它

关于Online Judge System的编译延时的一种解决方案

2010-12-08 01:55 260 查看
在OJ里,编译是评测的第一步。
通常情况下,大家都是用bat文件加命令行进行编译的。但这里不好控制时间。如果用一个线程去监控这个编译进程,进程结束就下一步的话,未免有点小题大做了。

我采用的是下面一种“文件锁”的方法:
在创建bat文件的同时创建一个“文件锁”文件,如”.lock”。
然后在bat文件的最后一行加入一句”del .lock”即可。而在程序中你只要在运行bat之后来一句
while(0 == access(“.lock”, 0));
这样就可以做到延时了。等到文件锁被删除之后,就表示文件编译完成。
当然,有可能编译时间过久,那这里也可以从while下文章,加一个条件,如果时间到了,则删掉这个进程即可。
下面是部分的实现代码:

Code:

/** 这段代码就是生成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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐