2015-10-08 37 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

这个伎俩。我知道这是我忽略的东西。谢谢! –