【问题标题】:Thread communication via printf and scanf (linux)通过 printf 和 scanf 进行线程通信(linux)
【发布时间】:2011-06-29 21:41:21
【问题描述】:

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

剩下要做的是创建 2 个文件句柄,一个用于通信的每个方向,并缓冲通信。 如何做到这一点?

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

特别重要的是,如果一个线程调用 scanf("%s", &x) 那么它将被阻塞,直到另一个线程写入一些字符串 and添加空格(因此字符串在完全写入之前不会被读取)。

【问题讨论】:

    标签: multithreading printf scanf filehandle


    【解决方案1】:

    您可以使用管道。 http://linux.die.net/man/2/pipe 。您可以简单地重定向标准输出和标准输入,而不是覆盖 printf 和 scanf。不过要小心,因为 printf 和 scanf 是不可重入的。

    【讨论】:

    • fprintf 和 fscanf 是可重入的吗?
    • (假设同时调用写入不同的文件句柄)
    • 我确实需要重写 scanf 和 printf 来识别调用线程是谁。但是管道确实是我所要求的解决方案,所以我接受了。谢谢。
    • 我不认为任何 printf 系列函数是可重入的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2012-06-19
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多