我正在使用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()调用失败..我无法理解这里有什么问题..
答案 0 :(得分:0)
您正在创建fifo,只允许访问拥有它的用户和组,然后使用setuid
更改用户。据推测,新用户无权访问该文件。
您需要在调用setuid
之前打开文件。
答案 1 :(得分:0)
我使用两个不同的文件而不是dup2。在第一个文件中,我打开父母写作并阅读孩子。第二,我向儿子写信并在父亲那里读书。
在这个问题中,我展示了我的一些方法