2011-06-29 36 views
1

在Linux中使用C++进行工作。 我有一个程序启动一个线程。 我需要主线程和子线程通过printf和scanf (两个线程的代码使用scanf和printf,并假定它与stdin和stdout通信,我必须保持这种方式)进行通信。 我设法覆盖printf和scanf,所以我可以完全控制这些函数 (我可以使用* pthread_self *标识调用线程)。通过printf和scanf(linux)进行线程通信

还有待做的是创建2个文件句柄,一个用于每个通信方向,并缓冲通信。 这怎么办?

写入到磁盘上的文件并不能解决我的问题,因为通信可能很长,我不能将它存储在磁盘上。但是,我知道读取线程在写入数据后不久就会读取数据,因此不需要很多缓冲。

尤其重要的是,如果一个线程调用的scanf(“%S”,& X)那么它会被阻塞,直到其他线程写入一些字符串加空格(因此字符串不在它完全写入之前阅读)。

回答

2

您可以使用管道。 http://linux.die.net/man/2/pipe。您可以简单地重定向stdout和stdin,而不是重写printf和scanf。不过要小心,因为printf和scanf不可重入。

+0

是fprintf和fscanf可重入吗? – user302099

+0

(假设同时调用写入不同的文件句柄) – user302099

+0

我确实需要重写scanf和printf来识别调用线程是谁。但管道真的是我所问的解决方案,所以我接受了。谢谢。 – user302099