【问题标题】:Real time input/output (chat-like)实时输入/输出(类似聊天)
【发布时间】:2014-08-25 08:03:42
【问题描述】:

在阅读了 Beej 的编程指南后,我正在尝试制作一个小聊天程序。

然后我在考虑程序本身的基础知识,我不知道如何同时打印recv()的输出和获取send()的输入,因为客户端总是可以写一些东西和发送,但是如何在他尝试输入时也打印一些东西?

我想到了线程,并且对它们有所了解,我创建了 2 个简单的线程:第一个,每 3 秒打印一个句子,第二个得到输入,这个小程序当然有一个很多问题,例如。如果你开始打字,而另一个线程需要打印一些东西,它会简单地接受你写的东西,并用自己的输出打印它。

这是代码,我尝试重新创建它,希望你们能帮助我..

pthread_t tid[2];

void* printse();
void* getinput();

int main(int argc, char *argv[])
{

    int error;
    error = pthread_create(&(tid[1]), NULL, &getinput, NULL);

    if(error != 0)
    {
        printf("ERROR\n");
    } else {
    printf("NOERROR\n");
    }

    error = pthread_create(&(tid[2]), NULL, &printse, NULL);

    if(error != 0)
    {
        printf("ERROR\n");
    } else {
        printf("NOERROR\n");
    }

    sleep(5000);

    return 0;
    }

void* printse()
{
    while(1)
    {
        printf("POTATO\n");
        sleep(3);
    } 
    return NULL;
}

void* getinput()
{
    char *input;
    while(scanf("%s", input) != EOF)
    {
        printf("-%s\n", input);

    }

    return NULL;
}

【问题讨论】:

    标签: c unix real-time


    【解决方案1】:

    您的代码中有undefined behavior:您在getinput 中有一个未初始化的指针input

    未初始化的(非静态)局部变量有一个不确定的值,它看起来是随机的。由于值是不确定的(并且看似随机),scanf 调用将写入内存中的某个未知位置,覆盖那里的任何内容。

    您可以通过将input 设为数组来轻松解决此问题。

    【讨论】:

    • 好的,谢谢,我做到了,它解决了我的一些问题。但是程序仍然会输出如下内容: POTATO\n POTATO\n hellPOTATO\n o\n -hello\n
    • @Alfaso 输出将被混合是你无能为力的,除非你有一种锁定机制来防止一个线程输出而另一个线程正在等待输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多