我正在寫一個聊天客戶端,它必須在接收用戶輸入的同時輸出接收的消息。
到目前爲止,我分成了兩個獨立的進程,其中一個進程監聽套接字連接,並用printf寫出接收到的字符串。另一個使用readline讀取用戶輸入並將其發送到服務器。停止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);
}
}
在fork中搜索等待函數以解決您的問題 –
目標是能夠在消息進入時顯示消息,而不是等待用戶完成打印,然後打印收到的消息。我認爲這就是你使用信號量的意思。 –