多进程如何使用相同的ncurses屏幕? 我用C++编写了一个C++多进程程序。

多进程如何使用相同的ncurses屏幕? 我用C++编写了一个C++多进程程序。,c++,multiprocessing,ncurses,C++,Multiprocessing,Ncurses,每个进程都需要在屏幕上显示一些内容 我的示例代码: int main() { initscr(); noecho(); curs_set(0); int flag = fork(); if (flag == -1) exit(1); else if (flag == 0) { WINDOW *win = newwin(4, 4, 0, 0); int n = 0; while (1) { mvwprintw(win, 0, 0

每个进程都需要在屏幕上显示一些内容

我的示例代码:

int main() {
  initscr();
  noecho();
  curs_set(0);

  int flag = fork();
  if (flag == -1)
    exit(1);
  else if (flag == 0) {
    WINDOW *win = newwin(4, 4, 0, 0);
    int n = 0;
    while (1) {
      mvwprintw(win, 0, 0, "%d", n % 9);
      wrefresh(win);
      n = (n + 1) % 9;
      sleep(1);
    }
  }
  else {
    WINDOW *win = newwin(4, 4, 8, 8);
    int n = 0;
    while (1) {
      mvwprintw(win, 0, 0, "%d", n % 9);
      wrefresh(win);
      n = (n + 1) % 9;
      sleep(1);
    }
  }
  endwin();

  return 0;
}
但它只能在屏幕上显示一个进程的信息


我该如何解决它呢?

我对一些丑陋的东西进行了黑客攻击,这些东西大致可行,但可以说明问题所在。我怀疑其他进程与之通信的单个窗口管理器进程会更好,或者是一些可怕的互斥体

#include <stdlib.h>
#include <unistd.h>
#include <curses.h>
int main() {
  initscr();
  noecho();
  curs_set(0);
    WINDOW *win0 = newwin(4, 4, 0, 0);
    WINDOW *win1 = newwin(4, 4, 8, 8);

  int flag = fork();
  if (flag == -1)
    exit(1);
  else if (flag == 0) {
    int n = 0;
    while (1) {
      mvwprintw(win0, 0, 0, "%d", n % 9);
      wrefresh(win0);
      wrefresh(win1);
      n = (n + 1) % 9;
      sleep(1);
    }
  }
  else {
    int n = 0;
    while (1) {
      mvwprintw(win1, 0, 0, "%d", n % 9);
      wrefresh(win1);
      wrefresh(win0);
      n = (n + 1) % 9;
      sleep(1);
    }
  }
  endwin();

  return 0;
}
#包括
#包括
#包括
int main(){
initscr();
noecho();
curs_集(0);
WINDOW*win0=newwin(4,4,0,0);
WINDOW*win1=newwin(4,4,8,8);
int flag=fork();
如果(标志==-1)
出口(1);
else if(标志==0){
int n=0;
而(1){
mvwprintw(win0,0,0,“%d”,n%9);
wrefresh(win0);
wrefresh(win1);
n=(n+1)%9;
睡眠(1);
}
}
否则{
int n=0;
而(1){
mvwprintw(win1,0,0,“%d”,n%9);
wrefresh(win1);
wrefresh(win0);
n=(n+1)%9;
睡眠(1);
}
}
endwin();
返回0;
}

该示例创建了两个4x4窗口,第二个偏移量为8,8。所以他们没有共同点

因为您使用的是fork(而不是vfork),所以这两个进程应该有单独的地址空间,并且一个进程不应该刷新在另一个进程中修改的窗口。在某些情况下,开发人员选择将
vfork
fork
等同起来。使用Linux时,系统会:

标准说明
(来自POSIX.1)函数的作用与fork(2)的作用相同, 如果由
vfork()
修改除用于 存储来自
vWork()
的返回值,或从中的函数返回的值 调用了哪个
vWork()
,或者在成功调用
\u exit(2)
exec(3)
函数族之前调用了任何其他函数

但他接着说

标准对
vWork()
的要求比 那些放在
分叉(2)
上的实现,因此这两个都是 同义词是兼容的。特别是,程序员不能依赖 在父级上保持阻止状态,直到子级终止或 调用execve(2),并且不能依赖于任何特定的行为 关于共享内存

一位开发人员认为,让这两个功能相似其实并不重要

断言存在单独的地址空间:

子进程和父进程在单独的内存中运行 空格。在执行fork()时,两个内存空间具有相同的大小 内容。内存写入、文件映射(
mmap(2)
)和取消映射 由其中一个进程执行的(
munmap(2)
)不会影响 其他的

但是我们在
vWork
的描述中留下了这种模糊性。作为此
vfork
行为的一部分,您的程序可能无法更新属于父进程的窗口-在建议的答案中刷新两个窗口只会确认
fork
函数是伪装的
vfork

POSIX当前没有用于
vWork
的页面。它有(描述值得一读)

无论哪种方式,使用
vWork
实际上都不会改善情况。如果必须在同一地址空间内工作,那么线程就是为了这个目的。如果必须使用单独的进程,那么让一个进程更新屏幕,让其他进程与管道通信就是人们实际要做的事情

有评论指出,
fork
已过时。POSIX在这方面有不同的说法。引用以下理由:

引入posix_spawn()函数及其密切关系posix_spawn()是为了克服fork()的以下感知困难:如果没有交换或动态地址转换,fork()函数很难或不可能实现

  • 对于实时环境,交换通常太慢

  • 动态地址转换并非在POSIX可能有用的任何地方都可用

  • 当POSIX必须在没有地址转换或其他MMU服务的情况下运行时,进程太有用了,不能简单地选择退出POSIX

因此,POSIX需要进程创建和文件执行原语,这些原语可以在没有地址转换或其他MMU服务的情况下高效地实现

posix_spawn()函数可以作为库例程实现,但posix_spawn()和posix_spawn()都设计为内核操作。此外,尽管它们可能是许多fork()/exec对的有效替代品,但它们的目标是为难以使用fork()的系统提供有用的流程创建原语,而不是提供fork()/exec的插入式替代品。

进一步阅读:


您可能需要线程而不是单独的进程。使用线程可以工作,谢谢。但是,使用多进程来实现它是一项必须完成的任务。^ u^@πάνταῥεῖ感谢您花时间解释。Re:POSIX和
vfork()
vWork()
已被POSIX 2008淘汰,任何使用
vWork()+execve()
的东西最好使用
POSIX\u spawn()
。我使用
fork()
而不使用
exec()