Deux processus lisant le même stdin

Dans un programme C, j’ai un menu avec quelques options, représenté par des caractères. Une option forque le processus et exécute une fonction (on peut dire qu’elle s’exécute en arrière-plan). Cette fonction qui s’exécute en arrière-plan peut, sous certaines conditions, demander à l’utilisateur de saisir des données.

Mon problème est le suivant: lorsque le processus principal demande des données (ou une option) et que le processus enfant demande également des données, je ne peux pas envoyer les données correctement.

Avez-vous une idée sur la façon de gérer cela?

Je vais append un peu de la structure du code (je ne peux pas tout afficher car il y a environ 600 lignes de code):

int main(int argc, char *argv[]) { // Some initialization here while(1) { scanf("\n%c", &opt); switch(opt) { // Some options here case 'r': send_command(PM_RUN, fiforfd, fifowfd, pid); break; // Some more options here } } } void send_command(unsigned char command, int fiforfd, int fifowfd, int pid) { // Some operations here if(command == PM_RUN) { time = microtime(); childpid = fork(); if(childpid == -1) { // Error here } else if(childpid == 0) { // Here is the child // Some operations and conditions here // In some condition, appears this (expected a short in hexadecimal) for(i = 0; i < 7; ++i) scanf("%hx\n",&data[i])); // More operations exit(0); } } } 

Cela ne fonctionne pas mais cela peut être un début de solution

 void send_command(int *p) { pid_t pid; pid = fork(); // check -1 if (pid == 0) { int i = 0; int h; int ret; char buffer[128] = {0}; dup2(p[0], 0); while (i < 2) { if ((ret = scanf("%s\n", buffer))) { //get your value from the buffer i++; } } printf("done\n"); exit(1); } } 

dans le processus enfant, vous allez tout lire à partir de l'entrée, puis trouver la valeur dont vous avez besoin à l'intérieur.

 int main() { char opt; int p[2]; pipe(p); while(1) { scanf("\n%c", &opt); write(p[1], &opt, 1); write(p[1], "\n", 1); switch(opt) { // Some options here case 'r': { send_command(p); break; } default: break; // Some more options here } } } 

Dans le cas présent, chaque caractère que vous avez lu sera écrit dans le processus enfant qui a lu sur p [0].

Bien sûr, si vous avez plusieurs processus enfants, vous devez avoir une liste de descripteurs de fichiers et écrire à chacun d'eux (et appeler un canal pour chaque enfant).

Bonne chance

edit: peut - être devriez-vous regarder namedpipe où le processus parent écrit tout et que l'enfant lit dans le même