我正在尝试在使用execvp
启动的一个进程与其父进程之间设置管道。
现在,我像这样fork / pipe / dup / exec:
pid_t child = 0;
int fds[2];
...
void fork_exec(string cmd) {
pipe(fds);
child = fork();
if(child == 0) {
close(fds[1]);
char *input = (char*)cmd.c_str();
char *cmdArg[100];
char *token = strtok(input, " \n");
int i = 0;
cmdArg[i] = token;
//while this is not the last token
while(token != NULL) {
token = strtok(NULL, " \n");
cmdArg[++i] = token;
}
cmdArg[++i] = NULL;
close(fds[0]);
dup2(1, fds[1]);
execvp(cmdArg[0], cmdArg);
} else {
close(fds[1]);
}
}
然后,在程序的另一部分,当函数返回时,一段时间后,另一个函数(作为父级的一部分运行)尝试将管道值写入文件。
void out(string name) {
ofstream fout;
fout.open((*cmdIter).c_str(), ofstream::app);
long lSize = 1000;
char * buffer;
buffer = new char[lSize];
close(fds[1]);
read(fds[0], buffer, lSize);
fclose (pFile);
fout.write(buffer, lSize);
fout.close();
delete [] buffer;
waitpid(child, &res, 0);
}
但是这部分代码不起作用,而是创建文件但不向其写入任何内容,并将输出打印到屏幕上。我相信子线程应该阻塞,直到有东西写入?
答案 0 :(得分:2)
我认为错误就在这里:
dup2(1, fds[1]);
来自dup2(2)
:
int dup2(int oldfd, int newfd);
...
dup2() makes newfd be the copy of oldfd, closing newfd first
if necessary, but note the following:
所以你刚刚关闭了pipe(2)
以上几行返回的filedescriptor。尝试交换两个:
dup2(fds[1], 1);