Cette question découle de ma tentative de mettre en œuvre les instructions de:
Tuyaux Linux comme entrée et sortie p>
Comment envoyer une chaîne simple entre deux programmes à l'aide de tuyaux? p>
http://tldp.org/ldp/lpg/node11.html P>
Ma question se trouve dans les lignes de la question dans: Tuyaux de "Linux comme entrée et sortie , mais plus précis. p>
essentiellement, j'essaie essentiellement Pour remplacer: p> à l'aide de tuyaux en C ++ afin d'éviter d'utiliser le disque dur. Voici mon code: P> system("program < input.txt > output.txt");
3 Réponses :
On dirait que vous recherchez Coprocesses . Vous pouvez les programmer en C / C ++, mais comme ils sont déjà disponibles dans la coquille (Bash), plus facile à utiliser la coque, à droite?
Démarrez d'abord le programme externe avec le cooproc code> intégré:
your_program <&${COPROC[0]} >&${COPROC[1]}
Dans mon cas, mon programme appelle à plusieurs reprises external_program (des milliers de fois), à chaque fois avec une entrée différente. Cela semble être un script de bash one-shot exécuté au lancement, non? Je ne sais pas beaucoup sur les descripteurs de fichiers, mais si je devais l'utiliser, cela signifie-t-il que je dois écrire dans un fichier sur le lecteur ou que le descripteur de fichier peut-il signaler une chaîne de mon code?
Les descripteurs de fichiers sont connectés aux tuyaux dans ce cas, pas de fichiers. En outre, vous pouvez également exécuter un script Bash des milliers de fois.
Votre problème principal est que vous avez les arguments à DUP2 () CODE> inversé. Vous devez utiliser:
Writing to child: <<this is the command data sent to the child cat (kitten?)>>
From child: <<this is the command data sent to the child cat (kitten?)>>
Cela a fonctionné magnifiquement. Merci pour votre aide et pour la tête du code sans forme. Je ne pense pas que j'aurai cette question avec ce programme, mais c'est bon de savoir.
Comment allons-nous exécuter ce code si je veux faire la même chose, mais pour deux processus enfants? Signification Envoi et réception des chaînes entre deux processus enfants ignorant le parent.
@MOHSIN: Cela dépend en partie de la manière dont les enfants communiqueront et sur ce que le processus des parents fera après avoir démarré les deux enfants. Il y a plusieurs façons de faire face à cela. Une option consiste simplement à avoir la fourche des parents avant de faire l'un des codes ci-dessus et que le processus parent de cette fourche peut quitter ou attendre ou continuer avec d'autres travaux, tandis que le processus enfant gère le code comme ci-dessus. Alternativement, le processus parent définit les deux tuyaux, fourchettes deux fois et chaque enfant trie sa propre plomberie tandis que le parent ferme les quatre descripteurs de fichier pour les deux tuyaux et va sa propre manière.
Ya j'ai fait exactement la deuxième méthode que vous avez suggérée, je fais tout simplement une pipe et appelle deux fourches une pour enfant_a autre pour enfant_b, si le pid_child_a est zéro, il écrit au tuyau d'autre si le pid_child_b est zéro, il se lit et imprime la valeur De la mémoire tampon, le problème est que lorsque je l'exécute la première fois qu'il court bien mais la deuxième fois que je cours, il n'imprime rien. Parfois, lorsque je nettoie le projet ou que vous effectuez à nouveau une sortie correcte, il commence à imprimer de nouveau la seconde et ainsi de suite.
et aussi si je l'exécute en mode de débogage, il donne une sortie correcte chaque fois que
@MOHSIN: Je ne peux pas déboguer votre code de la description vague dans un commentaire. Si vous pouvez le faire dans un MCVE ( exemple de reproductible minimal ), vous pouvez alors poser une question à ce sujet ici sur Donc, sinon, voyez mon profil, mais il devrait toujours être aussi proche d'un MCVE que possible. Je ne sais pas pourquoi vous obtiendriez le comportement erratique si vous vous assurez que chaque variable est initialement initialisée et que chaque appel système réussit. En tant que première étape du débogage, assurez-vous que vous vérifiez vos appels système.
#include <stdio.h> #include <unistd.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <string.h> #include <iostream> using namespace std; int main() { int i, status, len; char str[10]; mknod("pipe", S_IFIFO | S_IRUSR | S_IWUSR, 0); //create named pipe pid_t pid = fork(); // create new process /* Process A */ if (pid == 0) { int myPipe = open("pipe", O_WRONLY); // returns a file descriptor for the pipe cout << "\nThis is process A having PID= " << getpid(); //Get pid of process A cout << "\nEnter the string: "; cin >> str; len = strlen(str); write(myPipe, str, len); //Process A write to the named pipe cout << "Process A sent " << str; close(myPipe); //closes the file descriptor fields. } /* Process B */ else { int myPipe = open("pipe", O_RDONLY); //Open the pipe and returns file descriptor char buffer[21]; int pid_child; pid_child = wait(&status); //wait until any one child process terminates int length = read(myPipe, buffer, 20); //reads up to size bytes from pipe with descriptor fields, store results // in buffer; cout<< "\n\nThis is process B having PID= " << getpid();//Get pid of process B buffer[length] = '\0'; cout << "\nProcess B received " << buffer; i = 0; //Reverse the string for (length = length - 1; length >= 0; length--) str[i++] = buffer[length]; str[i] = '\0'; cout << "\nRevers of string is " << str; close(myPipe); } unlink("pipe"); return 0; }
Votre proposition de départ n'est pas claire. Vous déclarez que vous souhaitez remplacer
/ répertoire / programme sortie.txt code> avec quelque chose à l'aide de tuyaux afin d'éviter l'accès au système de fichiers. Mais vous avez besoin de plusieurs processus pour faire utiliser des tuyaux sensibles. (Vous peut I> utiliser des tuyaux dans un seul processus, mais cela n'a pas de sens habituellement.) Donc, vous pourriez avoir
/ répertoire / programme1 sortie.txt code>; Cela a du sens (et vous avez peut-être déjà utilisé
/ répertoire / programme1 intermédiaire.txt; / répertoire / programme2 sortie.txt code>). Veuillez clarifier votre intention.
Bon point. J'ai édité la question.
En tant que clarification supplémentaire, mon objectif est fondamentalement identique à la question dans: Stackoverflow.com/questions/1734932/... que vous avez répondu auparavant (grande réponse à la manière).
@Ericinclan Comment dirigerions-nous ce code si je veux faire la même chose, mais pour deux processus d'enfants? Signification Envoi et réception des chaînes entre deux processus enfants ignorant le parent.
@Mohsin je n'ai jamais tenté cela auparavant. Malheureusement, je ne peux pas vous donner des conseils à ce moment-là.