Перенаправление вывода подпроцесса в FIFO не работает

Я разветвляюсь процесс и запускаю mysqldump с execl. Я хочу перенаправить вывод mysqldump в FIFO, который я создал. Но открытие fifo не удается и поэтому dup2 ().

int main(int argc, char** argv) {
int i;
char *fifoname="/home/maverick/myfifo";
mkfifo(fifoname,0666);

int forkret=fork();
if(forkret==0){
setuid(getpwnam("mysql")->pw_uid);
cout<<"In child....Running as :"<<(int)getuid()<<endl;
sleep(2);
int fdw=open(fifoname,O_WRONLY);

if ((dup2(fdw, STDOUT_FILENO)) != STDOUT_FILENO)
cout<<"Error redirecting output of mysqldump ";
if (dup2(fdw, STDERR_FILENO) != STDERR_FILENO)
cout<<"Error redirecting error stream of mysqldump";
execl("mysqldump","-u","root","-proot","--all-databases");
}
else{
char buf[20];

int fdr=open(fifoname,O_RDONLY);
while(read(fdr,(char*)buf,sizeof(buf))!=0){
cout<<buf;
}

}
return 0;
}

Вызов open () не выполняется .. Я не могу понять, что здесь не так ..

0

Решение

Вы создаете fifo, разрешающий доступ только пользователю и группе, которой он принадлежит, и затем используете setuid изменить пользователя. Предположительно, новый пользователь не имеет прав доступа к файлу.

Вам нужно открыть файл до призвание setuid,

0

Другие решения

Я использую два разных файла вместо dup2. В первом файле я открываю для записи в родительском и чтения в дочернем. Второе я открываю для написания в сыне и чтения для отца.

В этом вопросе я покажу немного того, как я

FIFO — восстановить связь в C ++

0

По вопросам рекламы [email protected]