使用单个管道处理数组
Process array using a single pipe
我是系统多道程序设计的新手。
我设法创建了一个允许父亲和 child 交谈的管道。
child写的是精灵的位置,而爸爸是用ncurses库在控制台写的。
#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define ENEMYSPRITE "()"
#define BOMB "#"
typedef struct {
char * c;
int x;
int y;
int oldx;
int oldy;
pid_t pid;
}
pos;
void gameBoard(int pipein) {
int row, col;
getmaxyx(stdscr, row, col);
pos pos_enemy, readValue;
while (1) {
read(pipein, & readValue, sizeof(readValue));
if (strcmp(readValue.c, ENEMYSPRITE) == 0) {
if (pos_enemy.x >= 0) {
mvaddstr(pos_enemy.y, pos_enemy.x, " ");
}
pos_enemy = readValue; // e mi salvo la nuova
}
mvaddstr(readValue.y, readValue.x, readValue.c);
refresh();
}
}
void enemy(int pipeout) {
int passo = 1;
int row, col;
pos pos_enemy;
pos_enemy.c = ENEMYSPRITE;
pos_enemy.x = 10;
pos_enemy.y = 5;
getmaxyx(stdscr, row, col);
write(pipeout, & pos_enemy, sizeof(pos_enemy));
while (1) {
getmaxyx(stdscr, row, col);
if (pos_enemy.x < col - 3 && pos_enemy.x > 0)
pos_enemy.x += passo;
else {
if (pos_enemy.x == 0)
pos_enemy.x++;
else
pos_enemy.x--;
passo = passo * -1;
}
write(pipeout, & pos_enemy, sizeof(pos_enemy));
usleep(100000);
}
}
int main(int argc, char ** argv) {
initscr();
noecho();
curs_set(0);
int fdescriptor[2];
pipe(fdescriptor);
pid_t pidEnemy = fork();
if (pidEnemy == 0) {
close(fdescriptor[0]);
enemy(fdescriptor[1]);
} else {
close(fdescriptor[1]);
gameBoard(fdescriptor[0]);
}
return 0;
}
我想生成 N childs,它们生成精灵,而父亲负责将它们写入控制台。
但我不知道该怎么做,也不知道我是否必须用一根或多根管道来做
谁能帮我找出正确的解决方案是什么,以及如何实施它?
谢谢
EDIT Barmar 的回答是正确的,但是 gameBoard 中也可能有问题,因为即使这两个进程是 运行(我验证了是否打印它们的 pids)第二个敌人没有显示
一个循环中可以创建N个子进程。
for (int i = 0; i < N; i++) {
pid_t pidEnemy = fork();
if (pidEnemy == 0) {
close(fdescriptor[0]);
enemy(fdescriptor[1]);
}
}
close(fdescriptor[1]);
gameBoard(fdescriptor[0]);
写入管道是原子的,只要它们小于 PIPE_BUF
,在 Linux 上是 4096,并且需要在 POSIX 之前达到 lesat 512,所以您不必担心来自两个子进程的消息会混在一起。
我是系统多道程序设计的新手。
我设法创建了一个允许父亲和 child 交谈的管道。 child写的是精灵的位置,而爸爸是用ncurses库在控制台写的。
#include <curses.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define ENEMYSPRITE "()"
#define BOMB "#"
typedef struct {
char * c;
int x;
int y;
int oldx;
int oldy;
pid_t pid;
}
pos;
void gameBoard(int pipein) {
int row, col;
getmaxyx(stdscr, row, col);
pos pos_enemy, readValue;
while (1) {
read(pipein, & readValue, sizeof(readValue));
if (strcmp(readValue.c, ENEMYSPRITE) == 0) {
if (pos_enemy.x >= 0) {
mvaddstr(pos_enemy.y, pos_enemy.x, " ");
}
pos_enemy = readValue; // e mi salvo la nuova
}
mvaddstr(readValue.y, readValue.x, readValue.c);
refresh();
}
}
void enemy(int pipeout) {
int passo = 1;
int row, col;
pos pos_enemy;
pos_enemy.c = ENEMYSPRITE;
pos_enemy.x = 10;
pos_enemy.y = 5;
getmaxyx(stdscr, row, col);
write(pipeout, & pos_enemy, sizeof(pos_enemy));
while (1) {
getmaxyx(stdscr, row, col);
if (pos_enemy.x < col - 3 && pos_enemy.x > 0)
pos_enemy.x += passo;
else {
if (pos_enemy.x == 0)
pos_enemy.x++;
else
pos_enemy.x--;
passo = passo * -1;
}
write(pipeout, & pos_enemy, sizeof(pos_enemy));
usleep(100000);
}
}
int main(int argc, char ** argv) {
initscr();
noecho();
curs_set(0);
int fdescriptor[2];
pipe(fdescriptor);
pid_t pidEnemy = fork();
if (pidEnemy == 0) {
close(fdescriptor[0]);
enemy(fdescriptor[1]);
} else {
close(fdescriptor[1]);
gameBoard(fdescriptor[0]);
}
return 0;
}
我想生成 N childs,它们生成精灵,而父亲负责将它们写入控制台。 但我不知道该怎么做,也不知道我是否必须用一根或多根管道来做
谁能帮我找出正确的解决方案是什么,以及如何实施它? 谢谢
EDIT Barmar 的回答是正确的,但是 gameBoard 中也可能有问题,因为即使这两个进程是 运行(我验证了是否打印它们的 pids)第二个敌人没有显示
一个循环中可以创建N个子进程。
for (int i = 0; i < N; i++) {
pid_t pidEnemy = fork();
if (pidEnemy == 0) {
close(fdescriptor[0]);
enemy(fdescriptor[1]);
}
}
close(fdescriptor[1]);
gameBoard(fdescriptor[0]);
写入管道是原子的,只要它们小于 PIPE_BUF
,在 Linux 上是 4096,并且需要在 POSIX 之前达到 lesat 512,所以您不必担心来自两个子进程的消息会混在一起。