2014-06-15 3 views
0

execvp를 사용하여 ls -l, who, cp -r ./aaa//bbb 등과 같은 명령을 실행하고 있습니다. 동일한 명령을 실행하려고 시도 할 때까지는 아무 문제가 없습니다. 두 번째 명령. 예를 들어 나는 ls -l (모든 것이 좋다), who (모든 것이 좋다), 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 ** 명령에 내 args를 전달하기 위해 명명 된 파이프를 사용합니다. args가 char ** 명령에 올바르게 전달되면 printf를 통해 확인했습니다. execvp에서 한 번 이상 같은 명령을 실행하는 데 문제가 있습니까? 미리 감사드립니다!

+1

나는 포크 먼저 가정? 문제는 포크와 관련이있을 수 있습니다. 여전히 문제를 보여주는 완전한, 최소한의 예제를 제공 할 수 있다면 우리에게는 훨씬 더 쉬워 질 것입니다. –

+0

그래, 나는 fork()를 사용한다. 나는 그것을 편집하려고 노력할 것이다. –

+1

[완성 된 재현 가능한 예] (http://stackoverflow.com/help/mcve)를 제공해주십시오. 프로그램을 실행하고 코드를 쳐다 보는 것보다 충돌이 발생한 곳을 확인하면 문제를 쉽게 파악할 수 있습니다. – Gilles

답변

0

나는의 사용에 대한 걱정 (? 또는 파이프) 항상 파일의 크기를 바이트 단위로 읽을 것

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

, 읽고 전화를 할 때마다. 귀하의 파일이 올바르게 구성되어있을 수 있습니다,하지만 만약 당신이 실수 로이 명령에 너무 많은 데이터를 당기고 있는지 궁금하네요.

예를 들어, 파일/파이프가 가득 경우 다음

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

SIZE는 다음과 같이 정의됩니다. 80이되면 첫 번째 호출에서 2를 t_args로 읽지 만 첫 번째 읽기는 나머지 데이터를 명령 [0]으로 사용할 수 있습니다. 명령 [1] 에 대한 두 번째 읽기에는 데이터가 없습니다.

설명에서 데이터가 어떻게 보이는지 ... 분명히 알 수 있습니다. 각 읽기 호출 후 루프 반환 값과 함께 루프별로 인쇄하는 것이 좋습니다. 일반적으로 read는 실제로 읽은 바이트 수를 반환합니다 ... 이것을 사용하면 답을 온건하게 확인할 수 있습니다. 도움이

희망, - execvp는 새로운 프로그램을 호출 프로세스를 대체하기 때문에 J.