将子进程输出重定向到FIFO不起作用

时间:2012-12-21 14:21:46

标签: c++ ipc fifo

我正在使用execl运行进程并运行mysqldump。我想将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()调用失败..我无法理解这里有什么问题..

2 个答案:

答案 0 :(得分:0)

您正在创建fifo,只允许访问拥有它的用户和组,然后使用setuid更改用户。据推测,新用户无权访问该文件。

您需要在调用setuid之前打开文件

答案 1 :(得分:0)

我使用两个不同的文件而不是dup2。在第一个文件中,我打开父母写作并阅读孩子。第二,我向儿子写信并在父亲那里读书。

在这个问题中,我展示了我的一些方法

FIFO - Restore communication in C ++