ラウンド2
いくつかの回答を読んだ後、私の修正されたコードは次のとおりです。
int pid = fork();
if (pid == -1) {
perror("fork");
} else if (pid == 0) {
if (in) { //if '<' char was found in string inputted by user
int fd0 = open(input, O_RDONLY, 0);
dup2(fd0, STDIN_FILENO);
close(fd0);
in = 0;
}
if (out) { //if '>' was found in string inputted by user
int fd1 = creat(output, 0644);
dup2(fd1, STDOUT_FILENO);
close(fd1);
out = 0;
}
execvp(res[0], res);
perror("execvp");
_exit(1);
} else {
waitpid(pid, 0, 0);
free(res);
}
動作しますが、標準出力が再接続されていないようです。実行は次のとおりです。
SHELL$ cat > file
hello, world
this is a test
SHELL$ cat < file //no output
SHELL$ ls //no output
「<」と「>」はどちらも機能しますが、実行後に出力はありません。
ラウンド1
しばらくの間、C で比較的単純なシェルに取り組んできましたが、入力 (<) および出力 (>) リダイレクトの実装に問題があります。次のコードの問題を見つけるのを手伝ってください:
int fd;
int pid = fork();
int current_out;
if (in) { //if '<' char was found in string inputted by user
fd = open(input, O_RDONLY, 0);
dup2(fd, STDIN_FILENO);
in = 0;
current_out = dup(0);
}
if (out) { //if '>' was found in string inputted by user
fd = creat(output, 0644);
dup2(fd, STDOUT_FILENO);
out = 0;
current_out = dup(1);
}
if (pid == -1) {
perror("fork");
} else if (pid == 0) {
execvp(res[0], res);
perror("execvp");
_exit(1);
} else {
waitpid(pid, 0, 0);
dup2(current_out, 1);
free(res);
}
私はそれを機能させるためにさまざまなことを試みてきたので、そこに不要な資料があるかもしれません. 何が問題なのかわかりません。