- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 fork() 和 ncurses 在进程之间进行正确的读写时遇到问题。我有一个控制应用程序输入的进程(让我称之为儿子),还有一个控制应用程序逻辑的进程(父进程)。
我的问题是我在管道内写入以将信息从儿子发送给 parent ,但 parent 没有读取任何内容。
由于非阻塞性质,我添加了等待和信号以在读写时相互排除进程。
让我给你看一些代码:)
//---- pipes, read i write no bloquejants ---------
int flags_f0 = fcntl(pip_fill[0],F_GETFL);
int flags_f1 = fcntl(pip_fill[1],F_GETFL);
int flags_p0 = fcntl(pip_pare[0],F_GETFL);
int flags_p1 = fcntl(pip_pare[1],F_GETFL);
int flags_read = fcntl(0,F_GETFL);
int flags_write = fcntl(1,F_GETFL);
fcntl(pip_fill[0],F_SETFL,flags_f0 | O_NONBLOCK);
fcntl(pip_fill[1],F_SETFL,flags_f1 | O_NONBLOCK);
fcntl(pip_pare[0],F_SETFL,flags_p0 | O_NONBLOCK);
fcntl(pip_pare[1],F_SETFL,flags_p1 | O_NONBLOCK);
fcntl(0,F_SETFL,flags_read | O_NONBLOCK);
fcntl(1,F_SETFL,flags_write | O_NONBLOCK);
//-------------------------------------------------
//---- semàfors ----
int id_Sem;
id_Sem = shmget (IPC_PRIVATE, sizeof(int), IPC_CREAT | 0600);
if (id_Sem == -1)
{
write(2,"Error!\n",7);
Sortir(&ll_a_r,&ll_res,&ll_mis,&ll_n_mis,&c,&c_write);
exit (0);
}
if(SEM_constructor(&sem1) < 0)
{
shmctl(id_Sem, IPC_RMID, NULL);
}
if(SEM_constructor(&sem2) < 0)
{
shmctl(id_Sem, IPC_RMID, NULL);
SEM_destructor (&sem1);
}
SEM_init (&sem1, 0);
SEM_init (&sem2, 0);
//------------------
//la primera vegada que entri en el fill posarem les següents dades a la var valor
Afegir_Cadena(&c,"M0:"); //on M0: menú principal
pantalla(w);
pinta_menu_principal(w,a_menus); //pinta el menú principal per pantalla
pid = fork();
switch (pid)
{
case -1: //ERROR
write(2,"Error!\n",7);
Sortir(&ll_a_r,&ll_res,&ll_mis,&ll_n_mis,&c,&c_write);
exit(-1);
break;
case 0: //FILL
close(pip_fill[0]); //tanquem l'extrem de la pipe que no usem (la de lectura)
close(pip_pare[1]); //tanquem l'extrem de la pipe que no usem (la d'escriptura)
while(1)
{
cc = getch();
if(cc != ERR)
{
if(cc == 0x0A)
{
printf("Enter [%s]\n", Retorna_Cad(&c_write));
SEM_wait (&sem1);
tmp = write(pip_fill[1],Retorna_Cad(&c_write),Retorna_Longitud(&c_write) + 1); //el fill escriu a la pipe la variable c
SEM_signal (&sem1); //longitud + 1: el +1 es per el \0
//printf("Ret: %d",tmp);
Esborra_Cadena(&c_write);
actualitza_pantalla(w);
}
else
{
Afegir_Caracter(&c_write,cc);
cc = ERR;
}
}
//***** READ PARE *********
SEM_wait (&sem2);
nbytes = read(pip_pare[0],valor,256); //el fill llegeix de la pipe la var un cop ha estat tractada per el pare
SEM_signal (&sem2);
if (nbytes > -1)
{
Inserir_Cad(&c,valor);
//tractar el missatge del pare
Tractar_Missatge_del_Pare(&ll_mis,&ll_res,&c,w,a_menus,&ll_a_r);
}
}
break;
default: //PARE
close(pip_fill[1]); //tanquem l'extrem de la pipe que no usem (la d'escriptura)
close(pip_pare[0]); //tanquem l'extrem de la pipe que no usem (la de lectura)
while(1)
{
temps_inici = (float)clock();
SEM_wait (&sem1);
nbytes = read(pip_fill[0],valor,256);//el pare llegeix de la pipe la var c
SEM_signal (&sem1);
if (nbytes > -1 || tmp > 0)
{ //vol dir que hem llegit algo per la pipe pip_fill
tmp++;
Inserir_Cad(&c,valor);
Tractar_Missatge_del_Fill (&ll_mis,&c,&ll_n_mis,w);
SEM_wait (&sem2);
write(pip_pare[1],Retorna_Cad(&c),Retorna_Longitud(&c) + 1); //el pare escriu a la pipe la var tractada
SEM_signal (&sem2);
actualitza_pantalla(w);
}
temps_final = (float)clock();
temps_per_bucle = (float)(temps_final - temps_inici) / (float)CLOCKS_PER_SEC;
Esborra_Cadena(&aux);
Afegir_Float (&aux, temps_per_bucle);
//mvwprintw(w[4],8,1,Retorna_Cad(&aux));
}
break;
}
}
else
{
exit(1); //login incorrecte --> sortim de l'aplicacio
}
我没有发布所有代码,只发布了通过等待和信号完成读写的主要部分。
也许我正在丢失一些我现在看不到的东西。事实上,儿子会写在“pipe_fill”上,而 parent 会从这个管道中读取,同样, parent 会写在“pipe_pare”上,然后儿子会从中读取以发送信息。
另外,我正在使用 ncurses 绘制所有窗口。
感谢您的帮助:)
最佳答案
好的,这是我想到的代码。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int pipePC[2];
int pipeCP[2];
pipe(pipePC);
pipe(pipeCP);
char buf[11];
int n;
switch (fork()) {
case -1:
exit (1);
break;
case 0: /* child */
close(pipePC[1]);
close(pipeCP[0]);
while (1) { /* read, then write */
n = read(pipePC[0], buf, 10); /* read the question */
if (n > 0) {
buf[n] = 0;
printf ("child got '%s'\n", buf); /* calculate the answer here */
write(pipeCP[1], "foobar", 6); /* write the answer */
}
else {
printf ("child got nothing\n");
exit (1);
}
sleep(2); /* only to slow down the output */
}
break;
default: /* parent */
close(pipePC[0]);
close(pipeCP[1]);
while (1) { /* write, then read */
write(pipePC[1], "barfoo", 6); /* ask a question */
n = read(pipeCP[0], buf, 10); /* get the answer */
if (n > 0) {
buf[n] = 0;
printf ("parent got '%s'\n", buf);
}
else {
printf ("parent got nothing\n");
exit (1);
}
sleep(3); /* only to slow down the output */
}
break;
}
}
关于c - 具有非阻塞输入和 fork 的 Ncurses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421575/
我正在用 C 和 C++ 编写 ncurses 程序。我还没有找到向用户隐藏光标的方法。我在互联网上查了一下,但我发现的大多数信息要么涉及 (n)curses 的 Python/Ruby 实现,要么实
我有我的 window WINDOW *win = newwin(40, 40, 3, 3); 当输入一些文本并跨越更多行时,保留窗口内边框周围整齐空白的最佳方法是什么?我似乎找不到在 NCurses
我使用 ncurses 创建了一个单窗口菜单方案并让它运行起来。当我添加第二个窗口时,我无法再触发我的 wgetch 调用(或者看起来是这样)。 函数原型(prototype)让我有些困惑: int
我一直在测试 ncurses,我尝试使用 Windows 编写一个简单的代码,通过阅读教程中的代码,在我看来,如果仅对一个窗口进行更改,调用 wrefresh() 就足够了。所以我尝试了以下代码,但它
我是一名初学者 C 程序员,我的一项任务要求我为 Logo 编程语言编写一个解释器。为此,我想知道是否有可能在使用 ncurses 库时将屏幕拆分,以便一半保留具有常规文本输入/输出的基本终端属性,另
在 ncurses 中捕获 control+key 的正确方法是什么? 当前我正在这样做定义控制,如下所示: #define ctl(x) ((x) & 0x1f) 它工作正常,但问题是我不能同时捕捉
有没有办法在mvwprintw中使用ANSI转义码? mvwprintw(window, 0, 0,"%c[%dmCOLORED_TEXT!\n", 0x1B, 32);//doesn't work
我以前问过这样的问题,但它有点误导,因为我没有包括打印顺序。自从我了解了整个概念的变化后,我认为再问一次会更合适。 #include using namespace std; in
我对 ncurses 比较陌生,只是想知道在我开始的 ncurses TUI 中显示在终端/命令行中执行的命令输出的简单方法是什么。即像这样的伪代码(我知道它不起作用,只是为了得到重点:)目标是呈现一
我正在使用 ncurses 在 C 中创建一个基于控制台的应用程序,它接受单个键输入但也读取组合键。例如,当用户同时按下 S 键和 F 键时,我希望它运行一些功能。是否有一些像 getch() 这样的
我试图通过将值 COLOR_BLUE 设置为 rgb 值(1000, 0, 0)来将文本 block 的背景设置为红色。如果我使用 Gnome 的“终端”应用程序,背景是正确的(红色),但如果我使用
main :: IO() main = runCurses $ do setEcho False w ev == EventCharacter 'q' || ev == EventChara
我需要使用 ncurses 实现一个简单的文本阅读器,有点像 unix 的 less。 我在理解如何操作时遇到问题。我目前有一个窗口,每次我按下向下键(例如)时,我都会在适当的起点刷新所有行,给人一种
为什么这段代码在这里: #include #define WIN 5 #define WI win[0] #define WC win[1] int ymax, xmax; WINDOW *win[
我正在使用 ncurses 构建我自己的终端。我的主窗口包含 5 个其他窗口。我位于下面的窗口是提示面板。我希望在那里输入文本,并且我也希望能够在那里输入文本。我已使用 wmove 定位光标,但光标仍
我正在尝试使用 ncurses 库在屏幕的特定点上色。 我写了这段代码: #include int main(void) { initscr(); start_color();
我正在使用 ncurses 为我的应用程序制作一个简单的 TUI。我掌握了创建和打印到窗口的基础知识,但我在输入方面遇到问题。 当我写完的时候,光标定位在我写的字符串的末尾 但是当我开始打字时,光标会
我有一个基本的 Linux 发行版,运行在一台连接激光的机器上。我想开发一个界面,它允许我: 配置激光设置(例如工具栏和按钮) 显示激光的当前路径(例如图形窗口) 因为这些是最基本的机器,所以我没有安
平台:Linux 3.2.0 x86 (Debian Wheezy) 编译器:GCC 4.7.2 (Debian 4.7.2-5) 我正在编写一个需要 ncurses 提供的高级终端控制的程序,但我无
我一直在尝试自学 ncurses,到目前为止我很喜欢它。但是,我正在尝试编写一个像 pico 或 nano 这样的小型文本编辑器。到目前为止,我已经设置得相当好。我创建了一个函数来映射键。无论我做什么
我是一名优秀的程序员,十分优秀!