停止readline,printf,然后恢复readline

时间:2011-11-07 03:22:31

标签: c sockets asynchronous fork readline

我正在写一个聊天客户端,它必须输入用户输入,同时输出收到的消息 到目前为止,我已经分成两个独立的进程,其中一个继续监听套接字连接并用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);
    }
  }

2 个答案:

答案 0 :(得分:0)

我的建议是你找到一种让对方等待的方法。另外,如果它是pthread,那么等待和信号将解决这个问题

答案 1 :(得分:0)

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