使用单个管道处理数组

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,所以您不必担心来自两个子进程的消息会混在一起。