2012-12-21 58 views
0

我把一個進程,並與EXECL運行的mysqldump。我想將mysqldump的輸出重定向到我創建的FIFO。但是開放fifo失敗了,所以dup2()。重定向子輸出到FIFO不能正常工作

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()調用是failing..I無法理解什麼是錯在這裏..

+1

你不檢查mkfifo'的'結果(或其他大多數函數調用爲此事)一點點。成功了嗎? 'open'失敗後'errno'的值是多少? –

+0

我可以用ls命令看到fifo ... open與-1一起失敗 – Sreekar

+0

錯誤發生後,errno的值是多少? –

回答

0

您所創建的FIFO只允許擁有它的用戶和組訪問,然後使用setuid更改用戶。據推測,新用戶沒有權限訪問該文件。

你需要調用setuid之前打開文件

0

我用兩個不同的文件,而不是DUP2。在第一份文件中,我打開寫在父母身上並閱讀孩子。第二我打開寫在兒子和父親的閱讀。

在這個問題上我表現出我該怎麼辦

FIFO - Restore communication in C++