如何解决随机睡眠execlp程序上的坏地址来检查程序的执行时间
我正在尝试使用 fork() 制作一个简单的程序来执行命令或程序,并查看它是否在我通过参数引入的时间限制内完成,如下所示:
输入:
./timechecker 3 ls ps ls
所以我所知道的是,我在最后用 NULL 正确完成了 execlp,但我不知道为什么我从 sleep execlp 中得到随机结果有时它说地址错误,它在我的输出中说与该运行相关的程序已被迫完成,但它的发生与我使用的时间无关。示例输出:
execlp sleep: Bad address //The ls execlp
PID TTY TIME CMD //The ls execlp without sleep error
execlp sleep: Bad address //The ps execlp
225 pts/3 00:00:00 a.out //The ps without sleep error
231 pts/3 00:00:00 ps
232 pts/3 00:00:00 a.out <defunct>
PID TTY TIME CMD
225 pts/3 00:00:00 a.out
233 pts/3 00:00:00 ps
234 pts/3 00:00:00 a.out
Total time: 0
1 programs have been forced to finish taking more than 1000 seg and 2 programs have been finished under the time limit
代码:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#define error(a){perror(a);exit(1);}
int main(int argc,char *argv[]) //argv1 timeLimit argv2..argv11 commands
{
if (argc > 12 || argc < 3)
{
error("Incorrect number of arguments");
}
int timeLimit = atoi(argv[1]);
if(timeLimit < 0)
{
error("The time limit must be 0 or greater")
}
int programs = argc - 2;
int forced = 0;
int finished = 0;
char program[100] = "";
int i = 0,pid,pid_clock,pid_dev = 0,estatus;
time_t t1,t2;
t1 = time(NULL);
while(i<programs) //i<nb_tests
{
pid = 0;
pid_clock = 0;
estatus = -1;
t2 = time(NULL);
pid = fork();
switch(pid)
{
case -1:
error("fork")
case 0:
strcpy(program,argv[i]);
execlp(program,program,NULL);
error("execlp programm");
default:
pid_clock = fork();
switch(pid_clock)
{
case -1:
error("fork")
case 0:
execlp("sleep","sleep",timeLimit,NULL); //The problem
error("execlp sleep");
default:
pid_dev = wait(NULL);
if(pid_dev == pid_clock)
{
kill(pid,SIGKILL);
wait(NULL);
estatus = 0;
break;
}
else if(pid_dev == pid)
{
kill(pid_clock,SIGKILL);
wait(NULL);
estatus = 1;
break;
}
else
{
printf("%d\n",pid_dev);
estatus = -1;
break;
}
}
}
t2 = time(NULL) - t2;
if(estatus == 0)
{
forced++;
}
else if(estatus == 1)
{
finished++;
}
i++;
}
t1 = time(NULL) - t1;
printf("Total time: %li \n",t1);
printf("%d programs have been forced to finish taking more than %d seg and %d programs have been finished under the time limit\n",forced,finished);
return 0;
}
解决方法
用于 exec
函数的命令的参数是一个 字符串列表。它们实际上就是执行程序中的字符串数组 argv
。
您传递一个 整数 值作为 sleep
命令的参数,而不是字符串。这会导致未定义的行为,并且很可能会崩溃。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。