2011-11-07 97 views
2

我正在寫一個聊天客戶端,它必須在接收用戶輸入的同時輸出接收的消息。
到目前爲止,我分成了兩個獨立的進程,其中一個進程監聽套接字連接,並用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); 
    } 
    } 

回答

0

我用pthreads而不是叉。不需要信號量或互斥量。
線程意味着它是共享內存,而不是進程拆分,我不得不明確聲明它是共享的。因此readline數據可用於兩個線程,並且避免了該問題。

0

我的建議是你找到一種方法,使在另一個等待。其他,如果它是線程,然後等待和信號將解決這個問題

+0

在fork中搜索等待函數以解決您的問題 –

+0

目標是能夠在消息進入時顯示消息,而不是等待用戶完成打印,然後打印收到的消息。我認爲這就是你使用信號量的意思。 –