2016-09-20 2 views
0

나는 집에서 만든 껍질 (아주 간단한 껍질)을 연구 중이다. 내 경로가 내 셸의 변경 가능한 요소가 아니므로 execvp를 사용하는 경로를 결정했습니다. 한 번에 여러 프로세스를 포크하고 실행하는 방법에 대한 논리와 함께 문제가 발생했습니다.포크와 여러 프로세스를 동시에 수행

내 프로그램이 같은 명령으로 작동합니다 :

ls ; echo hello ; cat shell.c 

경우 각 ";" 우리는 이러한 프로세스를 동시에 실행하고자 함을 나타냅니다. 그래서 우리 터미널 출력에서 ​​우리는 한꺼번에이 명령들의 혼합을 얻어야합니다.

내가 내 프로그램 작동 방법을 설명하고 싶습니다 정교하게하려면 :

A. Intake full command line into char array with a grab line function 
B. Split the char array received from the last function by delimiters and place into an array of char arrays (pointer to pointer). 
C. If one of the elements in our array of char arrays is ";" we can assume that multi commands are necessary. This is where I have trouble. 

내가 지금까지 나는 그런 포크와 필요가 정확히 얼마나 많은 프로세스를 알고으로 입수했습니다,하지만 난 포장 수없는 것 내 이 모든 함수와 인수를 execvp 함수에 한 번에 전달하는 방법에 대해 머리를 숙십시오. 임시 배열을 사용해야합니까? 나는 이것이 복잡하지 않아야한다는 것을 알고 있지만, 어떤 이유로 그것을 이해할 수는 없다. I는 문자 어레이의 배열을 섭취 따라서 다중 명령들이 (내 분할 선 함수) 필요할 때 설정 내 "MultiCommand는"변수

int launch(char **args){ 

    pid_t pid; 
    int status; 
    int i = 0; 

    if(strcmp(args[0], "quit") == 0){ 
     exit(EXIT_SUCCESS); 
    } 

    if(strcmp(args[0], ";") != 0){ 
     printf("Essential Command Found : %s\n", args[0]); 
     numFork++; 
    } 


    if(multiCommand == 1){ 
     //Handle Multicommands here 
     printf("Multi Commands Handling Here\n"); 

     for(; i < elements - 1; i++){ 
      if(strcmp(args[i], ";") == 0){ 
       if((i + 1) < elements){ 
        printf("Essential Command Found : %s\n", args[i + 1]); 
        numFork++; 
       } 
      } 
     } 

     //This is where I need to figure out what to do 

     printf("Fork: %d times\n", numFork); 


    }else if (multiCommand == 0){ 
     pid = fork(); 
     if(pid == 0){ 
      execvp(args[0], args); 

     }else{ 
      wait(&status); 
     } 
    } 

    multiCommand = 0; 
    elements = 0; 

    return 1; 
} 
+3

사이드 노트 :'표준 쉘에서를, '일반적으로 '/'는 백그라운드에서 실행되어 다음 bei를 발생시키는 것을 의미합니다. 이전 작업이 끝날 때까지 기다리지 않고 실행하십시오. – kaylum

+2

실행할 각 프로세스마다 한 번 포크해야합니다. 해당하는 자식은 어떤 명령을 실행할지를 알 수 있습니다 (반드시 확인해야합니다). 'execvp()'시스템 콜은 많은 명령어가 아닌 하나의 명령어만을 실행합니다. 그러나 하나의 명령어는 많은 명령어를 실행하기위한 쉘이 될 수 있습니다. –

답변

2

일반에 기초하여 실행한다 아래 내 발사 기능을 제출있어 생각은 서로 다른 명령에 대해 for 루프를 사용하고 각 명령을 포크하는 것입니다.

예.

for(int i = 0; i < commandCount; i++) { 
    int pid = fork(); 
    if(pid == 0) { //this is the child (don't forget to check for errors and what-not) 
     execCommand(all, of, the, info, needed); 
    } 
} 

쉽게 strtok()를 사용하여 다른 명령을받을 수 있습니다.
다음은 예입니다 :

#include <string.h> 
#include <stdio.h> 
int main() { 
    char input[] = "abc;def;ghi"; 
    char *token = strtok(input, ";"); 
    while(token != NULL) { 
     printf("%s\n", token); 
     token = strtok(NULL, ";"); 
    } 
    return 0; 
} 

출력 :

abc 
def 
ghi 

같은 것을 볼 것이다 마지막 기능 :

char *token = strtok(input, ";"); 
while(token != NULL) { 
    int pid = fork(); 
    if(pid == 0) { 
     //token is one command 
     //parse the different parts here 
     execCommand(args, to, exec); 
    } 
    token = strtok(NULL, ";"); 
} 
+0

고마워, 내게 가장 힘든 부분은 다음 세미콜론까지 "execvp"의 두 번째 인수로 명령을 전달하는 것 같다. 나는 그 부분을 알아낼 수 없다. –

+1

하나의 명령으로 작업한다면, 입력을 char 배열의 배열로 나누고 단일 명령과 동일한 방식으로 전달할 수 있습니다. – Riley

+1

@ s.gang이 편집이 도움이 되었기를 바랍니다. – Riley

관련 문제