【问题标题】:Stop readline, printf, then resume readline停止 readline,printf,然后恢复 readline
【发布时间】:2011-11-07 03:22:30
【问题描述】:

我正在编写一个聊天客户端,它必须在接收用户输入的同时输出接收到的消息。
到目前为止,我已经分叉成两个独立的进程,其中一个继续监听套接字连接并用 printf 写出接收到的字符串。另一个使用 readline 读取用户输入并将其发送到服务器。

我现在遇到的问题是打印的字符串显示在终端中输入字符串的顶部。

我认为下面的代码可以防止这种情况发生,但看起来它不是跨线程共享的。

#define xprintf(...) my_rl_printf(__VA_ARGS__)
void my_rl_printf(char *fmt, ...)
{
    int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;
    char *saved_line;
    int saved_point;
    if (need_hack)
    {
        saved_point = rl_point;
        saved_line = rl_copy_text(0, rl_end);
        rl_save_prompt();
        rl_replace_line("", 0);
        rl_redisplay();
    }

    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);

    if (need_hack)
    {
        rl_restore_prompt();
        rl_replace_line(saved_line, 0);
        rl_point = saved_point;
        rl_redisplay();
        free(saved_line);
    }
}

在我的小测试工具中

 if (fork() == 0)
  {//child
    int time = 0;
    int count = 0;
    while(1)
    {
      ftime(&tp);
      if (tp.time > time)
      {
        time = tp.time;
        xprintf("count %d\n",count++);
      }
    }
  }
  else
  {
    int time = 0;
    while(1)
    {
      usr_in = readline("");
      xprintf("%s\n",usr_in);
    }
  }

【问题讨论】:

    标签: c sockets asynchronous fork readline


    【解决方案1】:

    我的建议是你想办法让一个人等待另一个人。另外如果是pthread,那么等待和信号就可以解决这个问题

    【讨论】:

    • 目标是能够在消息进入时显示消息,而不是等待用户完成输入然后打印收到的消息。我假设这就是您使用信号量的意思。
    【解决方案2】:

    我使用 pthreads 而不是 fork。不需要信号量或互斥量。
    线程意味着它是共享内存,而不是我必须明确将其声明为共享的进程拆分。因此,readline 数据对两个线程都可用,从而避免了该问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多