Остановите readline, printf, затем возобновите readline - PullRequest
2 голосов
/ 07 ноября 2011

Я пишу чат-клиент, который должен принимать пользовательский ввод при одновременном выводе полученных сообщений.
До сих пор я разветвлялся на два отдельных процесса, один из которых продолжает прослушивать соединение с сокетом и записывать полученные строки с помощью 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 голосов
/ 08 ноября 2011

Я использовал pthreads вместо fork.Не нуждался в семафоре или мьютексе.
Потоки означают, что это разделяемая память, а не процессное разделение, где мне пришлось бы явно объявить его как разделяемый.Таким образом, данные readline доступны для обоих потоков, и проблема устраняется.

0 голосов
/ 07 ноября 2011

Я предлагаю вам найти способ заставить одного ждать другого. иначе, если бы это был pthread, то ожидание и сигнал решили бы эту проблему

...