【问题标题】:printf() after UNIX fork()UNIX fork() 之后的 printf()
【发布时间】:2015-01-28 19:04:36
【问题描述】:

我正在开发一个非常基本的客户端服务器通信服务,只是为了了解这个概念。 在服务器端,我有一个接受连接并让客户端与服务器通信的函数。每当连接的客户端向服务器发送消息时,它都会向客户端发送响应消息。 在客户端,我创建了一个线程来监听来自服务器的消息/响应。该线程只是运行一个循环,检查 read() 是否返回超过 0 个字节,如果是则打印消息。其他线程处理用户输入并向服务器发送消息。

现在问题: 我有几行代码可以监听来自服务器的消息

void readFromServer(int fileDescriptor)
{
    int nOfBytes;
    char buffer[512];
    while(1){
        nOfBytes = read(fileDescriptor, buffer, 512);
        if(nOfBytes > 0)
            printf("Server says: %s \n\n>", buffer);
    }
}

这意味着当一条消息来自服务器时,我想这样表示它

>Serever says: Something

>|

但由于某种原因,我得到的是这个

>>Server says: Something

|

(| pipeline 表示控制台窗口中的光标)

有人知道这是为什么吗?这个问题有什么解决办法吗?

提前致谢。

编辑------------> fork() 是这样在 main 函数中完成的

int pid = fork();
if(pid != 0)
    readFromServer(sock);

【问题讨论】:

标签: c multithreading unix fork


【解决方案1】:

stdio 缓冲很可能会阻碍。要使标准输出无缓冲,请使用

setvbuf(stdout, 0, _IONBF, 0);

在开始 I/O 之前一次。这是一个 C89 函数,在 <stdio.h> 中声明。您的manual page 包含所有详细信息。

【讨论】:

    【解决方案2】:

    示例输出中的双 > 未由您提供的代码解释。可能您的其他线程也打印到stdout

    末尾缺少> 几乎可以肯定是因为stdout 默认情况下是行缓冲的,这意味着它会累积输出直到收到换行符,然后一次打印一行。您可以按照 Jens 的建议禁用缓冲,或在打印后调用 fflush(stdout) 来解决此问题。

    请注意,您对read() 的使用是有问题的。即使该消息小于您指定的 512 字节,也不一定能在一次调用中从另一端读取整条消息。此外,如果对方关闭网络连接,您的循环将进入旋转状态,每个 read() 调用都会立即返回 -1 而不会阻塞。

    【讨论】:

      【解决方案3】:

      您正在从一个线程写出输入提示“>”,而从另一个线程写出服务器语句。

      要制作您想要的 UI,您需要投资开发 curses(或 termcap)技术,以及线程同步或 select() 系统调用以从键盘和套接字读取。

      【讨论】:

        猜你喜欢
        • 2011-02-01
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多