2014-06-15 21 views
0

我正在使用execvp来执行一些命令,如ls -l,who,cp -r ./aaa ./bbb等。一切正常,直到我尝试执行相同的命令第二次。例如,我会告诉你我使用的命令:ls -l(一切正常),谁(一切正常),ls -l(坏地址)。这是我的代码:在execvp中没有运行相同的命令两次或更多

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

+1

我假设你叉首先,由于execvp新的方案替代了调用进程?问题可能与叉子有关。如果您可以提供一个完整的,最小的示例,但仍然会出现问题,它会使我们更容易。 –

+0

是的,我使用fork()。我会尝试编辑它。 –

+1

请提供[完整,可重现的示例](http://stackoverflow.com/help/mcve)。通过运行程序并查看崩溃位置,而不是通过盯着代码来发现问题通常更容易。 – Gilles

回答

0

我关心你的使用:(?或管)

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

那将会从您的文件大小字节总是读,每次调用读取时间。这可能是你的文件构建正确,但我想知道你是否意外地在这些读取命令中拉太多数据。

例如,如果文件/管填充有以下内容:

2, 'L', 'S', '', ' - ', 'L', '\ 0',1, '','','','','','','','','','','''

和SIZE被定义为是80,那么在你的第一次调用中,你将读入2到t_args中,但是你的第一次读取可能会将剩余的数据用到命令[0]中。第二次读取命令[1] 将没有数据。

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

希望帮助, - J.