Random sleep execlp bad address on program 检查程序执行时间
Random sleep execlp bad address on program to check the execution time of programs
我正在尝试使用 fork() 制作一个简单的程序来执行命令或程序,看看它是否在我通过参数引入的时间限制内完成,如下所示:
输入:
./timechecker 3 ls ps ls
所以我所知道的是我在最后用 NULL 正确地完成了 execlp 但我不知道为什么我从睡眠 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, timeLimit, finished);
return 0;
}
用于exec
函数的命令的参数是 字符串 的列表。实际上,它们是执行程序中的字符串数组 argv
。
您传递一个 整数 值作为 sleep
命令的参数,而不是字符串。这会导致 未定义的行为 并且很可能会崩溃。
我正在尝试使用 fork() 制作一个简单的程序来执行命令或程序,看看它是否在我通过参数引入的时间限制内完成,如下所示:
输入:
./timechecker 3 ls ps ls
所以我所知道的是我在最后用 NULL 正确地完成了 execlp 但我不知道为什么我从睡眠 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, timeLimit, finished);
return 0;
}
用于exec
函数的命令的参数是 字符串 的列表。实际上,它们是执行程序中的字符串数组 argv
。
您传递一个 整数 值作为 sleep
命令的参数,而不是字符串。这会导致 未定义的行为 并且很可能会崩溃。