我正在写一个聊天客户端,它必须输入用户输入,同时输出收到的消息 到目前为止,我已经分成两个独立的进程,其中一个继续监听套接字连接并用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 :(得分:0)
我的建议是你找到一种让对方等待的方法。另外,如果它是pthread,那么等待和信号将解决这个问题
答案 1 :(得分:0)
我使用pthreads而不是fork。不需要信号量或互斥量 线程意味着它是共享内存而不是进程拆分,我必须将其显式声明为共享。因此,两个线程都可以使用readline数据,并避免出现问题。