多进程如何使用相同的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
vfork()
vWork()
已被POSIX 2008淘汰,任何使用vWork()+execve()
的东西最好使用POSIX\u spawn()
。我使用fork()
而不使用exec()