2014-03-02 83 views
0

我有一个客户端服务器通过标准输入/标准输出进行通信。这工作得很好: mkfifo fifo0 client < fifo0 | server > fifo0 两个客户服务器基本上是这样的:fstream与iostream和mkfifo

int main() { 
    run(cin, cout); 
    return 0; 
} 

现在我想调试服务器。因此,在两个不同的shell中,我想这样做: gdb --args server fifo1 fifo0 和此: client fifo0 fifo1 我更改main以采用文件名参数。不幸的是,服务器失速。使用GDB,我看到它摊位在ifstream构造,在这里:

int main(int argc, char** argv) { 
    char const fin[] = "fifo1"; 
    cerr << "in: '" << fin << "'\n"; 
    ifstream sin(fin); 
    cerr << "opened\n"; 
    char const fout[] = "fifo0"; 
    cerr << "out: '" << fout << "'\n"; 
    ofstream sout(fout, ofstream::out | ofstream::app); 
    cerr << "opened\n"; 
    run(sin, sout); 
    return 0; 
} 

为什么行为不同,当输出流是ofstream("fifo0")?任何解决方案


已解决,但为什么?

它现在我输入FIFO之前打开输出FIFO,像这样:

int main(int argc, char** argv) { 
    char const fout[] = "fifo0"; 
    cerr << "out: '" << fout << "'\n"; 
    ofstream sout(fout, ofstream::out | ofstream::app); 
    cerr << "opened\n"; 

    char const fin[] = "fifo1"; 
    cerr << "in: '" << fin << "'\n"; 
    ifstream sin(fin); 
    cerr << "opened\n"; 
    run(sin, sout); 
    return 0; 
} 

会有人请解释为什么解决了这个问题?

+0

你在一起运行它们吗? – littleadv

+2

我并不完全遵循你正在做的事情,但我怀疑你正在运行正常的FIFO语义,即打开将阻塞,直到另一侧有读写器。由于shell会将它们重定向到您,因此直到您自行完成之后才会引起注意。 – Duck

+0

我已将问题简化为我确定的内容。这个更简单的问题更清楚吗? @littleadv:是的,同时在2个不同的终端。 – cdunn2001

回答

0

@Duck:你说得对。打开FIFO模块,直到每边都有。使用重定向时,外壳通常会处理该细节(| < >)。

0

由于您可能正在使用Linux,因此您可以从fifo手册页获得:“在Linux下,打开一个用于读取和写入的FIFO将在阻塞模式和非阻塞模式下都成功,POSIX会使此行为不确定。在没有可用阅读器的情况下打开FIFO进行写入。“