Я реализую оболочку, трубу и вилку. Я в основном передаю сообщения между двумя дочерними процессами одного и того же родителя. Отдельная команда работает, но конвейерные команды не работают. Я получаю ошибки, такие как плохие файловые дескрипторы. Кто-нибудь может мне с этим помочь ?
Ниже мой код.
/ * Форкинг родителя * /
if ((pid = fork()) <0)
cout<<"fork error";
/ * Если это ребенок * /
else if (pid == 0)
{
/* child */
if(pipe(pipeA)==-1)
cerr<<"Pipe Creation error"<<'\n';
/* Duplicating the output */
dup2(pipeA[1],1);
close(pipeA[0]);
/* Running the first command */
if(execvp(*command1,command1)<0)
{
cout<<"error in executing:"<< command<<'\n';
}
}
/ * В родительском ожидании, пока ребенок не завершит * /
if ( (pid = waitpid(pid, &status, 0)) < 0)
cout<<"waitpid error";
/* calling method, to create second process and execute it */
secondExecute(command2);
}
// Second process will be created here
void secondExecute(char *command2)
{
if ((pid = fork()) <0)
cout<<"fork error";
else if (pid == 0)
{
dup2(pipeA[0],0);
close(pipeA[1]);/* Executing the second process */
if(execvp(*args,args)<0)
{
cout<<"couldn't execute:"<< command2<<'\n';
}
}
if ( (pid = waitpid(pid, &status, 0)) < 0)
cout<<"waitpid error";
}
Вы должны создать трубу, прежде чем позвонить fork
, Если родитель и ребенок каждый pipe
Сами они будут создавать разные трубы. Вам нужен общий канал между двумя процессами.
Других решений пока нет …