1
我有一個家庭作業任務,需要我實現我自己的Linux shell。其中一部分要求我實現在同一命令中重定向輸入和輸出重定向的功能。錯誤的文件描述符 - 雙I/O重定向
嘗試運行排序<「文件名」>「文件名」時出現「排序:讀取失敗: - :錯誤文件描述符」錯誤。任何幫助表示讚賞!
int dualRedirect(char *toks[], string uCommand) {
int stats;
int fd;
int fd1;
int size;
vector<string> file;
string inFileName;
string outFileName;
string buffer;
int stdIn = dup(0);
int stdOut = dup(1);
stringstream stream(uCommand);
// Convert the command string to a vector
while (stream >> buffer)
file.push_back(buffer);
// Identify the size of the vector in order to identify the output filename
size = file.size();
outFileName = toks[size - 1];
// Find "<" in order to find the input filename, then set it to NULL in order
// to pass the appropriate args to the exec command
for (int ii = 0; toks[ii] != NULL; ii++) {
if (!strcmp(toks[ii], "<")) {
inFileName = toks[ii + 1];
toks[ii] = NULL;
}
}
// Open the input file and assign it to the fd variable
if ((fd = open(inFileName.c_str(), O_CREAT | O_WRONLY)) == -1) {
cerr << strerror(errno);
return 1;
}
// Set STDIN to the fd variable (redirect stdin to fd)
if (dup2(fd, STDIN_FILENO) == -1) {
return 1;
}
// Open the output filename and assign it to fd1
if ((fd1 = open(outFileName.c_str(), O_CREAT | O_WRONLY)) == -1) {
cerr << strerror(errno);
return 1;
}
// Set STDOUT to the fd1 variable (redirect stdout to fd1)
if (dup2(fd1, 1) == -1) {
cerr << strerror(errno);
return 1;
}
// Close the original fd file
if (close(fd) == -1) {
cerr << strerror(errno);
return 1;
}
// Close the original fd1 file
if (close(fd1) == -1) {
cerr << strerror(errno);
return 1;
}
// fork and execute, passing the command and args to exec.
if (fork()) {
waitpid(-1, &stats, NULL);
}
else {
execvp(toks[0], toks);
exit(-1);
}
// Restore the stdin and stdout file descriptors to their original values
dup2(stdIn, 0);
dup2(stdOut, 1);
return 1; }
爲什麼你使用'O_CREAT'和'O_WRONLY'作爲**輸入**文件? – Barmar
爲什麼你不是在尋找'>'來設置'outFileName'? – Barmar
@Barmar我使用WRONLY,以便它打開它只寫/只讀。 O_CREAT是複製/粘貼錯誤。 –