0
votes

Comment écrire une chaîne à la STDIN d'un autre processus dans FreePascal

Les cas d'utilisation les plus couramment exigent que les rapports d'erreur et d'exécution soient envoyés à l'administrateur système par courrier électronique. Dans BASH, vous utiliseriez le tuyau | code> tandis que dans: xxx pré>

Je cherche à appliquer le ce concept à FreePascal avec le TPROCESS Code> Classe. P>

Comment puis-je écrire la chaîne de rapport sur le courrier code> sous-processus p>

J'ai trouvé les informations à
https://wiki.freecal.org/executing_external_programs

Mais je ne décris pas exactement mon cas d'utilisation car il n'y a pas un premier processus p>


pour expliquer la problématique des opérateurs | code> ne fonctionne pas strong> et option shell = true code> (de python em> subprocess.popen code>) non existant fort> tel que documenté à:
Remplacement des opérateurs de shell P>

i écrit un petit Perl em> script en tant que mailer Dummy: P>

prms (cnt: '5'):
prm: '-s'
prm: 'Mail Command Test'
prm: 'user_login@localhost'
prm: '<'
prm: 'mail_message.txt'
message: ''


1 commentaires

Si je comprends votre question, vous pouvez utiliser lishnn et tuyer les données sur votre programme.


3 Réponses :


1
votes

Studing the FreePascal em> Architecture J'ai compris que la fonctionnalité | code> est implémentée avec TProcess.input code> propriété qui est en effet un TOUTUDPIPIPESTREAM . /p>Le TOUTUTPIPIPESTREAM code> est la mise en œuvre oborientée du tuyau de code> code> https://www.freecal.org/docs-html/fcl/ TOUCHES / TOUTUTPIPITESTREAM.HTML P>

TOUTUTPIPIPESTREAM code> est créé par le CreateEpipeStreams code> appel à représentent l'extrémité d'écriture d'un tuyau. C'est un ttream code> descendant qui ne permet pas la lecture. p> blockquote>

donc à ttream code> Objets que vous pouvez écrire avec le tstream.write () code> fonction. p>

depuis le Echo Code> Commande dans BASH CODE> imprime simplement un texte que je suis simplement remplacé par un TStringStream code> qui pousse de manière dynamique et donne des résultats dans une chaîne code> Pascal code>. Cela vient utile pour la génération de rapports progressifs. La chaîne code> résultante code> Vous pouvez l'utiliser directement et l'écrire dans le flux tprocess.input code>. P>

Note: forte > Vous devez appeler tprocess.execute code> avant de pouvoir écrire dans le flux d'entrée car il s'agit du moment où le système Fork () code> L'appel se produit et le tuyau est ouvert.
Mais encore le tprocess code> n'est pas en cours d'exécution car il attend toujours pour la entrée stdin code>. P> xxx pré>

réellement vous pouvez observer dans Le journal code> Strace Code> que le TPROCESS CODE> crée des pipes, la recherche de la commande code> code> et les fourche-dessus du processus principal: p> xxx pré>

La sortie du programme Mail_pipe est la suivante: p> xxx pré>

Il s'agit d'une sortie normale et attendue depuis Mail code> donnerait une sortie si elle a échoué. Plus de détails sur le traitement par e-mail Vous pouvez trouver dans votre maillog local code>. P>

En conséquence, vous obtenez un email dans votre boîte aux lettres locale forte>: p>: p>

strace: Process 24911 attached restart_syscall(<...
resuming interrupted nanosleep ...>) = 0 mmap(NULL, 32768,
PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x7ff970770000 pipe([3, 4])                            = 0 pipe([5,
6])                            = 0 access("noexec_script.pl", F_OK)  
= 0 fork()                                  = 27068 close(4)                                = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27068, si_uid=1000, si_status=127, si_utime=0, si_stime=0} --- close(5)     
= 0 write(1, "Mail Input: Writing ...\n", 24) = 24 write(1, "Mail Input (Length '9'):\n", 25) = 25 write(1, "'test mail'\n", 12)       
= 12 write(6, "test mail", 9)                = -1 EPIPE (Broken pipe)
--- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=24911, si_uid=1000} ---
+++ killed by SIGPIPE +++ 


0 commentaires

0
votes

Vous pouvez peut-être éviter d'écrire directement sur tuyau directement, mais résoudre votre problème en écrivant vos données sur MSGFILE , puis exécutez Exec avec la redirection d'entrée - Envoyer ...

Autant que je sache, les tuyaux sont créés en dehors de votre application et redirigent la sortie de votre programme vers l'entrée d'un autre programme A | b doit être identique que a> fichier && b . Si vous ne voulez vraiment pas attendre l'envoi à la fin, vous pouvez créer un thread séparé qui écrit au fichier, puis exécute envoyer et se termine quand c'est fait.

Une autre alternative peut être de parler directement au serveur de messagerie pour envoyer un courrier électronique et je suppose qu'il y a des unités pour le faire ...


6 commentaires

Merci pour votre participation. Oui, quand un programmeur Linux pense à la tâche, la première pensée est celle de rediriger l'entrée et la sortie, car elle fonctionne principalement dans toutes les langues de script principales Bash , python et < I> Perl . Mais à la documentation officielle wiki.freecal.org/... Il est clairement expliqué que la classe tprocess est pas a coquille Bash et ne fonctionnera donc pas comme ceci. Mais je suis toujours intrigué pour voir votre prototype comment vous réalisez pour faire ce travail.


La commande coquille la commande commande & signifie de cette manière pour exécuter la commande de manière détachée que la COMANK ne bloque pas le terminal. Exemple $ Echo "Hello World" & Le résultat est le pid du processus détaché: [1] 29152


Désolé, cet ampersand était ma tentative de wite pour la redirection IO de l'interface Stackoverflow. Je voulais dire que si vous écrivez votre contenu de courrier dans le fichier nommé 'SendFile', vous pouvez exécuter quelque chose comme "Mail -s" Mail Command Test "admin@domain.com


Peut-être que vous pouvez simplement utiliser quelque chose comme exécuté ('envoyer pour exécuter un programme externe?


S'il vous plaît, regardez mes exemples que j'ai ajoutés à la question pour démontrer la question de bien comprendre la problématique


Cher corps, vous pouvez vérifier qu'il n'y a pas d'espaces entre << / code> et nom de fichier. Cheers Robby



0
votes

Voici deux programmes communiquant via des fichiers. Deuxièmement, on commence la première via bash et redirige sa saisie au fichier créé précédemment:

program pr;
var s : string;
begin
  readln  (s);
  writeln (s)
end.

program test;
uses process;
var f : text; s : ansistring;
begin
  assign (f,'text');
  rewrite (f);
  writeln (f,'content');
  close (f);
  runcommand ('/bin/bash',['./pr <text'],s)
end.


2 commentaires

Merci pour votre temps et vos efforts que vous avez mis dans ce numéro. Votre solution pourrait réellement compiler et également fonctionner. Mais à part ne pas être une solution idiomatique et plutôt un bash écrit dans Pascal Il a plusieurs problèmes. 1) Il ne peut pas gérer plus de 256 octets 2) Il introduit le aérien de lancement d'un autre processus qui est la BASH Shell 3) La taille de la mémoire tampon est également limitée à 256 octets


Bonjour Bodo, c'était juste l'échantillon pour démontrer le concept. Je suppose que l'entrée de la boîte à lettres est comprise entre 256 caractères par ligne, si vous avez besoin de davantage, vous pouvez créer un fichier avec type de données personnalisé et lire / écrire avec juste une seule lecture / écriture. Idomaticaly Parler - Le fichier émule du fichier, vous pouvez exécuter le courrier inséré de bash et vous pouvez écrire Whatewer que vous souhaitez déposer (non limité à 256 octets). À partir de frais généraux, si vous souhaitez utiliser des pipes (Soluton travaillant uniquement sur UNIX-ES et non Windoze), vous aurez déjà le processus de messagerie tout le temps de l'autre extrémité de la pipe.