私はfork
とexecvp
を同時に使用して、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;
}
質問の最初の部分についてはわかりませんが、私は 'fork'を1回、' execvp'を2回呼び出します。成功した場合、 'execvp'は返されません。ループを再び実行するために戻ってくるものはありません。 – Kevin
@Kevinそれでは、 'execvp'を実行してループに戻ってくるのは理にかなっていますか? – Ambitions
私の答えを見てください。 – Kevin