0

我正在分叉一个进程并使用 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 () 调用失败..我不明白这里出了什么问题..

4

2 回答 2

0

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

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

于 2012-12-21T14:46:53.947 回答
0

我使用两个不同的文件而不是 dup2。在第一个文件中,我打开以写入父级并读取子级。第二个我打开儿子的写作和父亲的阅读。

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

FIFO - 在 C++ 中恢复通信

于 2016-11-18T12:52:45.877 回答