C UNIX fork()之后的printf()

C UNIX fork()之后的printf(),c,multithreading,unix,fork,C,Multithreading,Unix,Fork,我正在开发一个非常基本的客户机-服务器通信服务,只是为了学习这个概念。 在服务器端,我有一个函数,它接受连接并让客户端与服务器通信。每当连接的客户端向服务器发送消息时,它都会向客户端发送响应消息。 在客户端,我创建了一个线程来侦听来自服务器的消息/响应。这个线程只是运行一个循环,检查read()是否返回超过0字节,如果是,则打印消息。其他线程处理用户输入和向服务器发送消息 现在谈问题: 我有几行代码用于侦听来自服务器的消息 void readFromServer(int fileDescript

我正在开发一个非常基本的客户机-服务器通信服务,只是为了学习这个概念。 在服务器端,我有一个函数,它接受连接并让客户端与服务器通信。每当连接的客户端向服务器发送消息时,它都会向客户端发送响应消息。 在客户端,我创建了一个线程来侦听来自服务器的消息/响应。这个线程只是运行一个循环,检查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

>|
int pid = fork();
if(pid != 0)
    readFromServer(sock);
但出于某种原因,我得到的是这个

>>Server says: Something

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

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

提前谢谢

编辑----------------> fork()在main函数中完成,如下所示

>Serever says: Something

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

很可能是stdio缓冲造成了阻碍。要使标准输出无缓冲,请使用

setvbuf(stdout, 0, _IONBF, 0);

启动I/O前一次。这是一个C89函数,在
中声明。您的应用程序拥有所有详细信息。

很可能是stdio缓冲造成了阻碍。要使标准输出无缓冲,请使用

setvbuf(stdout, 0, _IONBF, 0);

启动I/O前一次。这是一个C89函数,在
中声明。您已经掌握了所有详细信息。

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


要创建您想要的UI,您需要在curses(或termcap)技术上进行开发,并通过线程同步或select()系统调用从键盘和套接字读取。

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


要创建您想要的UI,您需要在curses(或termcap)技术上进行开发,并使用线程同步或select()系统调用从键盘和套接字读取数据。

示例输出中的双
没有用您提供的代码进行解释。可能您的另一个线程也正在打印到
stdout

最后缺少
几乎可以肯定,因为默认情况下
标准输出是行缓冲的,这意味着它累积输出,直到收到换行符,然后一次打印一行。正如Jens所建议的,您可以通过禁用缓冲来解决这个问题,或者在打印后调用
fflush(stdout)


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

示例输出中的双
没有用您提供的代码解释。可能您的另一个线程也正在打印到
stdout

最后缺少
几乎可以肯定,因为默认情况下
标准输出是行缓冲的,这意味着它累积输出,直到收到换行符,然后一次打印一行。正如Jens所建议的,您可以通过禁用缓冲来解决这个问题,或者在打印后调用
fflush(stdout)


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

请参见抱歉,但是在主函数中
fork()
?请参见抱歉,但是在主函数中
fork()
?在哪里