2017-07-14 6 views
-1

私はforkexecvpを同時に使用して、2つのシェルコマンドを同時に実行しようとしています。私はmkdir folder1&mkdir folder2を入力すると、folder1という名前のフォルダとfolder2?という名前の別のフォルダを作成します(疑問符はフォルダ名に含まれています)。もう1つの問題は、2つのコマンドを実行した後でコードが終了することです。ループ条件がまだ有効であっても、コードが終了コード:0で終了するのはなぜですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define MAXLINE 80 /* The maximum length command */ 

int main(void) { 
    char *args [MAXLINE/2 + 1]; /* command line arguments */ 
    char *line = (char *) malloc((MAXLINE + 1) * sizeof (char)); 
    char *firstCommand = (char *) malloc((MAXLINE + 1) * sizeof (char)); 
    char *secondCommand = (char *) malloc((MAXLINE + 1) * sizeof (char)); 
    int shouldrun = 1; /* flag to determine when to exit program */ 
    pid_t pid; 
    while (shouldrun) { 
     printf("osh>"); 
     fflush(stdout); 
     fgets(line, MAXLINE, stdin); 
     if (strncmp(line, "exit", 4) == 0) { 
      shouldrun = 0; 
     } else { 
      firstCommand = strsep(&line, "&"); 
      secondCommand = strsep(&line, "&"); 
      pid = fork(); 
      if (pid == 0) { 
       // child 
       if (secondCommand != NULL) { 
        char *token; 
        int n = 0; 
        do { 
         token = strsep(&secondCommand, " "); 
         args[n] = token; 
         n++; 
        } while (token != NULL); 
        execvp(args[0], args); 
       } 
      } else { 
       // parent 
       char *token; 
       int n = 0; 
       do { 
        token = strsep(&firstCommand, " "); 
        args[n] = token; 
        n++; 
       } while (token != NULL); 
       execvp(args[0], args); 
      } 
     } 
    } 
    return 0; 
} 

UPDATE 1:

私はケビンの答えを追跡しようとした。ここ

はコードです。私は同時に複数のプロセスを実行しようとしています。 ps&ls&who&date。私は私に同じ動作を与えた再帰的な方法を試しました。ここに私のコードは次のとおりです。それは、あなたが一度forkをループを呼んでいるが、二回execvpを呼び出していない理由についてご質問については

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#define MAXLINE 80 /* The maximum length command */ 

void execute(char *command) { 
    char *args [MAXLINE/2 + 1]; /* command line arguments */ 
    char *parentCommand = strsep(&command, "&"); 
    pid_t pid = fork();; 
    if (pid == 0) { 
     // child 
     if (command != NULL) { 
      execute(command); 
     } 
    } else { 
     // parent 
     char *token; 
     int n = 0; 
     do { 
      token = strsep(&parentCommand, " "); 
      args[n] = token; 
      n++; 
     } while (token != NULL); 
     execvp(args[0], args); 
    } 
} 

int main(void) { 
    char *line = (char *) malloc((MAXLINE + 1) * sizeof (char)); 
    int shouldrun = 1; /* flag to determine when to exit program */ 
    while (shouldrun) { 
     printf("osh>"); 
     fflush(stdout); 
     fgets(line, MAXLINE, stdin); 
     if (strncmp(line, "exit", 4) == 0) { 
      shouldrun = 0; 
     } else { 
      execute(line); 
     } 
    } 
    return 0; 
} 
+0

質問の最初の部分についてはわかりませんが、私は 'fork'を1回、' execvp'を2回呼び出します。成功した場合、 'execvp'は返されません。ループを再び実行するために戻ってくるものはありません。 – Kevin

+0

@Kevinそれでは、 'execvp'を実行してループに戻ってくるのは理にかなっていますか? – Ambitions

+0

私の答えを見てください。 – Kevin

答えて

0

、あなたがラインから\nを切り捨てる必要があります:私はあなたが別の関数にforkexecvp通話が移動示唆しています。 2番目の質問については、プログラムを終了させないstdlib.hヘッダファイルのsystem機能を使用することができます。

1

。成功した場合、execvpは返されません。ループを再び実行するために戻ってくるものはありません。あなたがしなければならないのは、execvpごとに1回、forkと呼んでください。最初の質問について

void run_command(const char* command) { 
    /* I suggest you also check for errors here */ 
    pid_t pid = fork(); 
    if (pid == 0) { 
     /* get args, call execvp */ 
    } 
} 

/* in your loop */ 
run_command(firstCommand); 
run_command(secondCommand); 
+0

この場合、2つのコマンドは同時に実行されません。それらの間にアンパサンドを持つ2つのシェルコマンドを入力し、フォークを使用してそれらを同時に実行する必要があります。 – Ambitions

+0

なぜ彼らは同時に実行されないと思いますか?私のコードには何も待っていません。 – Kevin

関連する問題