在链接的ncurses程序中调整终端大小(fork/exec/wait)

在链接的ncurses程序中调整终端大小(fork/exec/wait),c,fork,ncurses,curses,C,Fork,Ncurses,Curses,有一些基于诅咒的程序被启动,使用fork/exec/wait在它们之间创建一个进程链 当调整xterm的大小并且只有第一个程序运行时,所有程序都可以正常工作。但是,当第二个(或第三个)程序正在运行时: savetty{}; endwin(); //分叉 如果(fork()!=0){ //在家长 等待(&状态); }否则{ //孩子 if(execlp(cmd,cmd,(char*)NULL)1){ argid=argv[1]; msg(“这是一个子进程”); } int-pid; int键; 做

有一些基于诅咒的程序被启动,使用
fork/exec/wait
在它们之间创建一个进程链

当调整
xterm
的大小并且只有第一个程序运行时,所有程序都可以正常工作。但是,当第二个(或第三个)程序正在运行时:

savetty{};
endwin();
//分叉
如果(fork()!=0){
//在家长
等待(&状态);
}否则{
//孩子
if(execlp(cmd,cmd,(char*)NULL)<0){
出口(1);
}
}
//子项退出:父项刷新其屏幕
重置();刷新();
所有程序似乎都试图同时刷新屏幕。从这一点上看,屏幕变得一团糟

exec
下一个程序之前,每个程序需要做些什么来“冻结”诅咒,直到
wait
返回

编辑:

当我将
fork/exec/wait
替换为
system()
时,一切正常。但我不能保留它(这只是一个测试),它是一个很大的遗留系统,强烈依赖于
fork/exec/wait
系统调用

我还试着运行
execlp(“/bin/sh”、“-c”、cmd)
,问题也是一样的

编辑2:从头开始的完整示例代码:

//取消注释以从fork/exec/wait切换到system()函数
//#定义使用系统
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效mybox(整数y、整数x、整数高度、整数宽度);
无效消息(字符*格式,…);
无效抽取();
int myexec(char*cmd);
int spawn_new_实例(char*cmd);
char*argid=NULL;
int main(int argc,char*argv[]){
initscr();
cbreak();
键盘(stdscr,真);
noecho();
draw();
如果(argc>1){
argid=argv[1];
msg(“这是一个子进程”);
}
int-pid;
int键;
做{
key=getch();
开关(钥匙){
大小写键\u调整大小:
清除();
msg(“按键调整”);
打破
案例“r”:
案例“R”:
pid=spawn_new_实例(argv[0]);
如果(argid){
#ifdef使用系统
msg(“从系统()返回”);
#否则
msg(“从pid%d返回”,pid);
#恩迪夫
}否则{
msg(“从pid%d返回-这是根进程”,pid);
}
打破
违约:
msg(“不支持的键'%d'。键入'。(点)退出”,键);
}
}while(key!='.');
endwin();
}
空满盒(空){
mybox(0,0,行,列);
}
无效mybox(整数y、整数x、整数高度、整数宽度){
int x2=x+宽度-1;
int y2=y+高度-1;
对于(int-ct=x;ct=0){
睡眠(1);
继续;
}否则{
msg(“现在无法打开进程。”);
返回-1;
}
}else if(errno==ENOMEM){
msg(“内存不足”);
返回-1;
}否则{
msg(“Errno=%u”,Errno);
返回-1;
}
}
如果(pid!=0){/*Parent*/
ret=waitpid(pid和状态,0);
sigprocmask(SIG_设置掩码和上一个块,(sigset_t*)0);
如果(ret==-1){
返回-1;
}
返回pid;
}else{/*儿童*/
sigprocmask(SIG_设置掩码和上一个块,(sigset_t*)0);
if(execlp(cmd,cmd,“child”,(char*)NULL)<0){
出口(1);
}
}
}
说明:

  • 键入“R”生成自身的链接新实例
  • 键入“.”(点)退出并返回到父进程
  • 在第一个(主)过程中,调整终端的大小。一切正常
  • 问题是:打开大量实例(10个或更多),调整终端大小。看起来它会多次刷新/重画屏幕,可能每个运行的实例都会刷新/重画一次。试着回到父母身边,似乎从这一点上看,他们都在试着去阅读《标准》一书