2015-10-08 55 views
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; } 
+0

爲什麼你使用'O_CREAT'和'O_WRONLY'作爲**輸入**文件? – Barmar

+0

爲什麼你不是在尋找'>'來設置'outFileName'? – Barmar

+0

@Barmar我使用WRONLY,以便它打開它只寫/只讀。 O_CREAT是複製/粘貼錯誤。 –

回答

1

變化

if ((fd = open(inFileName.c_str(), O_CREAT | O_WRONLY)) == -1) { 

到:

if ((fd = open(inFileName.c_str(), O_RDONLY)) == -1) { 

其中的「壞文件描述符」錯誤的原因是試圖從沒有打開讀數進行讀取, 。

+0

這個伎倆。我知道這是我忽略的東西。謝謝! –