在execvp中没有运行相同的命令两次或更多次

时间:2014-06-15 09:16:36

标签: c execvp

我正在使用execvp执行一些命令,如ls -l,who,cp -r。/ aaa。/ bbb等。一切正常,直到我尝试第二次执行相同的命令。例如,我会告诉你我使用的顺序:ls -l(一切都很好),谁(一切都很好),ls -l(坏地址)。这是我的代码:

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。 Args正确传递给char **命令,我用printf检查过。在execvp中,执行相同命令的次数是否有任何问题?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我担心你使用:

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

每次调用read时,都会从文件(或管道?)中读取大小字节。可能是您的文件构造正确,但我想知道您是否在这些读取命令中意外地插入了太多数据。

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

2,'l','s','',' - ','l','\ 0',1,'c','d','\ 0',2,'l', 's','',' - ','l','\ 0'

SIZE#define'd为80,然后在第一次调用时你将2读入t_args,但是你的第一次读取可能会将剩下的数据用于命令[0]。第二次读命令[1] 没有数据。

从您的描述中不清楚您的数据是什么样的......在每次读取调用后,以字节为单位循环打印出来,以及读取的返回值可能是个好主意。通常,read会返回实际读取的字节数...您可以使用它来帮助理智地检查您的答案。

希望有所帮助, - J.