gpt4 book ai didi

c++ - 编写我自己的 shell ...卡在管道上?

转载 作者:IT老高 更新时间:2023-10-28 22:17:51 26 4
gpt4 key购买 nike

在过去的几天里,我一直在尝试编写自己的 shell 实现,但我似乎一直无法让管道正常工作。我能够解析一行并单独 fork 管道之间的命令(例如:ls | sort),但似乎无法让它们将输入从一个管道传输到另一个管道。

我想我只是不明白如何正确使用 dup2() 和管道。

我现在已经包含了我仍然失败的代码... :( 所以卡住了...

void forkAndExecute( char* arrayOfWords[] , vector<pid_t> *vectorOfPIDs , bool hasNextCmd , bool hasPrevCmd) {

int fd[ 2 ];
pid_t pid;

if( hasNextCmd ){
pipe(fd);
}

pid = fork();

//error if PID < 0
if( pid < 0 ) {
cerr << ">>> fork failed >>>" << endl;
exit(-1);
}
//child process if PID == 0
else if( pid == 0 ) {
if ( hasPrevCmd ){
dup2(fd[0] , 0);
close(fd[0]);
close(fd[1]);

}
if ( hasNextCmd ){
dup2(fd[1],1);
close(fd[0]);
close(fd[1]);
}
execvp( arrayOfWords[0] , arrayOfWords );
cout << ">>> command not found >>>" << endl;
//if logic reaches here, exec failed
exit(0);
}
//parent process
else{
close(fd[0]);
close(fd[1]);
//if( ! isLastCmd ){

//}
vectorOfPIDs->push_back(pid);
}

}

最佳答案

第一个建议:符号常量比魔数(Magic Number)更好。

const int PIPE_READ = 0;
const int PIPE_WRITE = 1;
int fd[2];
pipe(fd);
// Now you can refer to fd[PIPE_READ] and fd[PIPE_WRITE].

第二个建议:退后一步,想想你想要完成什么。

您想生成两个进程,第一个进程的标准输出连接到第二个进程的标准输入。对吧?

因此,在 C 中,这意味着您需要调用 pipe,将 fd[PIPE_WRITE] 传递给第一个子进程,这将 dup2 为 1,并将 fd[PIPE_READ] 传递给第二个子进程,它将 dup2 它为 0。

只看forkAndExecute'的原型(prototype)就知道它做不到:

void forkAndExecute( char* arrayOfWords[] , vector *vectorOfPIDs , 
bool hasNextCmd , bool hasPrevCmd);

它只处理一个命令,并且通过查看该参数列表,除非它求助于邪恶的全局变量,否则它无法从其 PrevCmd 接收文件描述符或从其 NextCmd 接收文件描述符。

考虑如何管理您需要的文件描述符,并重新设计 forkAndExecute 以便能够使用这些。

关于c++ - 编写我自己的 shell ...卡在管道上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1461331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com