当前位置: 技术问答>linux和unix
信号通讯方式curses窗体刷新怪异问题!!!
来源: 互联网 发布时间:2016-05-20
本文导语: 程序中父子进程分别在自己的一个窗体中显示,第一次按tab键可以从父进程窗体切换到子进程窗体,再次按下tab键之后,程序已经且到父进程窗体,但是没有刷新出父进程窗口以前输入的东西。请问是怎么回事?是不...
程序中父子进程分别在自己的一个窗体中显示,第一次按tab键可以从父进程窗体切换到子进程窗体,再次按下tab键之后,程序已经且到父进程窗体,但是没有刷新出父进程窗口以前输入的东西。请问是怎么回事?是不是跟父子进程通过信号通讯有关,我去掉信号写的测试程序都可以相互之间切换啊?
代码如下:
#include
#include
#include
#include
void initcurses();
void initwin(WINDOW **wins,int k);
void cov(WINDOW **win,int i,int ch);
void tell_wait();
void wait_child(void);
void wait_parent(void);
void tell_child(pid_t pid);
void tell_parent(pid_t pid);
void sig_usr(int signo);
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;
main()
{
int ch,i=1,j =0 ,k=2;
int start=0;
int exit=0;
WINDOW *wins[2];
pid_t pid;
initcurses();
initwin(wins,k);
box(wins[0],'.',',');
box(wins[1],'!','#');
touchwin(wins[0]);
wrefresh(wins[0]);
tell_wait();
while (ch = wgetch(wins[0]))
{
switch(ch)
{
case 'q':
exit = 1;
break;
case 9:
if (0 == start) //第一次切换
{
if ((pid = fork()) == 0) //子进程
{
touchwin(wins[1]);
wrefresh(wins[1]);
while(ch = wgetch(wins[1]))
{
switch(ch)
{
case 9:
exit = 1;
break;
default:
cov(wins,1,ch);
break;
}
if (1 == exit)
{
tell_parent(getppid());
wait_parent();
}
}
}
else if(pid >0) //父进程
{
wait_child();
start = 1;
}
}
else
{
exit = 1; // 第二次由父进程切回来自动退出
}
break;
default:
cov(wins,0,ch);
break;
}
if (1 == exit) break;
touchwin(wins[0]);
wrefresh(wins[0]);
mvwaddstr(wins[0],3,4,"222222");
wrefresh(wins[0]);//再次切换到父窗体的时候,会显示22222但是为什么边框仍然为子窗体的边框
}
endwin();
}
void initcurses()
{
initscr();//初始化curses库
noecho();
keypad(stdscr,TRUE);
box(stdscr,'┃','━');
refresh();
}
void initwin(WINDOW **wins,int k)
{
int i;
for(i = 0;i
代码如下:
#include
#include
#include
#include
void initcurses();
void initwin(WINDOW **wins,int k);
void cov(WINDOW **win,int i,int ch);
void tell_wait();
void wait_child(void);
void wait_parent(void);
void tell_child(pid_t pid);
void tell_parent(pid_t pid);
void sig_usr(int signo);
static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;
main()
{
int ch,i=1,j =0 ,k=2;
int start=0;
int exit=0;
WINDOW *wins[2];
pid_t pid;
initcurses();
initwin(wins,k);
box(wins[0],'.',',');
box(wins[1],'!','#');
touchwin(wins[0]);
wrefresh(wins[0]);
tell_wait();
while (ch = wgetch(wins[0]))
{
switch(ch)
{
case 'q':
exit = 1;
break;
case 9:
if (0 == start) //第一次切换
{
if ((pid = fork()) == 0) //子进程
{
touchwin(wins[1]);
wrefresh(wins[1]);
while(ch = wgetch(wins[1]))
{
switch(ch)
{
case 9:
exit = 1;
break;
default:
cov(wins,1,ch);
break;
}
if (1 == exit)
{
tell_parent(getppid());
wait_parent();
}
}
}
else if(pid >0) //父进程
{
wait_child();
start = 1;
}
}
else
{
exit = 1; // 第二次由父进程切回来自动退出
}
break;
default:
cov(wins,0,ch);
break;
}
if (1 == exit) break;
touchwin(wins[0]);
wrefresh(wins[0]);
mvwaddstr(wins[0],3,4,"222222");
wrefresh(wins[0]);//再次切换到父窗体的时候,会显示22222但是为什么边框仍然为子窗体的边框
}
endwin();
}
void initcurses()
{
initscr();//初始化curses库
noecho();
keypad(stdscr,TRUE);
box(stdscr,'┃','━');
refresh();
}
void initwin(WINDOW **wins,int k)
{
int i;
for(i = 0;i
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。