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 の代わりに 2 つの異なるファイルを使用します。最初のファイルでは、親で書き込み、子で読み取るために開きます。2つ目は、息子の執筆と父親の読書に開かれています。

この質問では、私がどのように行うかを少し示します

FIFO - C ++ で通信を復元する

于 2016-11-18T12:52:45.877 に答える