Unix管道不等待我的read()命令

时间:2011-11-12 00:18:09

标签: multithreading unix pipe

我正在尝试在使用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);
}

但是这部分代码不起作用,而是创建文件但不向其写入任何内容,并将输出打印到屏幕上。我相信子线程应该阻塞,直到有东西写入?

1 个答案:

答案 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);