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 命令的参数,而不是字符串。这会导致 未定义的行为 并且很可能会崩溃。