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