在execvp中不运行同一命令两次或两次以上

在execvp中不运行同一命令两次或两次以上,c,execvp,C,Execvp,我使用execvp执行一些命令,如ls-l、who、cp-r./aaa./bbb等。在我第二次尝试执行相同的命令之前,一切都正常。例如,我将向您展示我使用的顺序:ls-l一切正常,谁一切正常,ls-lbad地址。这是我的代码: if(strcmp(com_instr, "issuejob") == 0) { pid = fork(); if(pid < 0) { perror("Fork");

我使用execvp执行一些命令,如ls-l、who、cp-r./aaa./bbb等。在我第二次尝试执行相同的命令之前,一切都正常。例如,我将向您展示我使用的顺序:ls-l一切正常,谁一切正常,ls-lbad地址。这是我的代码:

if(strcmp(com_instr, "issuejob") == 0)
{
        pid = fork();

        if(pid < 0)
        {           
            perror("Fork");
            exit(1);
        }

        else if(pid == 0)
        {                   
            sleep(0.1);

            //number of args
            read(fd, &t_args, sizeof(int));

            printf("t_args %d\n",t_args);

            commands = malloc(t_args*sizeof(char *));

            for(i=0; i<t_args; i++)
            {
                commands[i] = malloc(SIZE*sizeof(char));
            }   

            for(i=0; i<t_args; i++)
            {
                read(fd, commands[i], SIZE);
            }               

            //Receiving data from named-pipe

            /*temp_run = run_node->next;
            while(temp_run != NULL)
            {
                printf("jjjjjjjjjjjjjjjjjjjj %d",temp_run->job_id);
                temp_run = temp_run->next;
            }*/

            printf("command %s\n", commands[0]);        
            execvp(commands[0], commands);
            perror("execvp");
            exit(1);
        }

        else if(pid > 0)
        {
            temp_run = run_node; 
            for(i=0; i<run_num; i++)
            {
                if(temp_run->next != NULL) temp_run = temp_run->next;
                else break;                 
            }

            if((i <= run_num-1) && (wait_node->next == NULL))
            {
                temp_run->next = malloc(sizeof(run_list));
                temp_run = temp_run->next;
                saving_data_run(temp_run, j_id, line, 1, arg_num-1, pid);
                printf("pid:%d\n",temp_run->pid);
                ++running;
                send_data_for_exec(line, arg_num-1, fd);
            }

            else
            {
                temp_wait = wait_node;
                while(temp_wait->next != NULL) temp_wait = temp_wait->next;
                temp_wait->next = malloc(sizeof(wait_list));
                saving_data_wait(temp_wait, j_id, line, 0, arg_num-1, pid);
                wait_num++;
            }

        }

    j_id++;
}    

我使用命名管道在char**命令中传递参数。Args正确地传递给char**命令,我已经用printf检查过了。在execvp中多次执行同一命令是否有问题?提前谢谢

我担心您使用:

        for(i=0; i<t_args; i++)
        {
            read(fd, commands[i], SIZE);
        } 
每次调用read时,它总是从文件或管道中读取大小字节。这可能是因为您的文件构造正确,但我想知道您是否在这些读取命令中意外引入了太多数据

例如,如果文件/管道中填充了以下内容:

2,‘l’、‘s’、‘l’、‘l’、‘0’、‘1’、‘c’、‘d’、‘0’、‘2’、‘l’、‘s’、‘l’、‘0’

大小被定义为80,然后在第一次调用时将2读入t_参数,但第一次读取可能会将其余数据消耗到命令[0]中。第二次读取命令[1] 里面没有数据

从您的描述中不清楚您的数据是什么样子的。。。在每次读取调用之后,最好在循环中逐字节打印它,以及read的返回值。通常,read将返回实际读取的字节数。。。你可以用它来帮助理智检查你的答案

希望有帮助,
-J.

我假设您首先分叉,因为execvp用新程序替换调用过程?问题可能与叉子有关。如果你能提供一个完整的,最简单的例子来说明问题的话,这会让我们更容易。是的,我使用fork。我将尝试编辑它。请提供一个。通过运行程序并查看程序崩溃的地方,通常比盯着代码更容易发现问题。