Wie kann ich auf meinem System feststellen, wo die Prozessersetzung FIFO-Dateien erstellt?

463
Earl Sven

Ich schreibe eine C ++ - Anwendung und muss mit der Prozessersetzung in der Bash-Shell arbeiten.

Ich versuche, einen Weg zu finden, um die Pfade zu überprüfen, die als Argumente an mein Programm übergeben werden. Einige davon zeigen auf FIFO-Dateien, die durch Prozessersetzung erstellt wurden.

Gibt es eine Shell- (oder C ++) - Methode, mit der überprüft werden kann, ob das System diese Dateien erstellt /dev/fdoder woanders erstellt?

0

2 Antworten auf die Frage

0
dogbane

Verwenden Sie die -pOption, testwenn eine Datei eine Pipe ist:

#!/bin/bash file="$1" if [ -p "$file" ] then echo "$file is a pipe" fi 

Demo:

$ myscript.sh <(echo hello) /dev/fd/63 is a pipe 
Danke, dies ist möglicherweise hilfreich, um eine Lösung zu erstellen, sagt mir jedoch nicht, wo diese Dateien standardmäßig erstellt werden (/ dev / fd auf den meisten Systemen). Gibt es eine Umgebungsvariable oder etwas, das ich überprüfen könnte, um welchen Pfad es sich handelt? Earl Sven vor 12 Jahren 0
Warum? Sie sollten nicht wissen, wo sie erstellt werden. dogbane vor 12 Jahren 0
Der Grund, den ich wissen muss, ist die Überprüfung der Pfade, die als Argument an meine Anwendung übergeben werden. Was ich im Wesentlichen nenne, ist "myProg -fifopaths> (/ run / some / application)". Was mein Programm als die Argumente sieht, die an sein Haupt übergeben werden, ist "/ path / to / myProg -fifopaths / dev / fd / 63" usw. I Sie müssen überprüfen, ob Pfade, die an mein Programm übergeben werden, tatsächlich in / dev / fd sind, um sich zu vergewissern, dass es sich um Pfade zu einem FIFO handelt. Das Problem ergibt sich daraus, dass ich, wenn mein Programm auf _System-X_ ausgeführt wird, wenn sich FIFO-Pfade nicht in `/ dev / fd` befinden, wissen müssen, wo sich diese FIFO-Pfade auf _System-X_ befinden sollen, um die Argumente zu überprüfen. Earl Sven vor 12 Jahren 0
0
ZILjr

Die kurze Antwort ist, dass Sie dies nicht tun können. Nur weil in einem Verzeichnis bash standardmäßig FIFO-Pfade verwendet, bedeutet dies nicht, dass ein bestimmtes FIFO in diesem Verzeichnis von bash erstellt wurde oder dass es von bash als Argument an Ihren Befehl übergeben wurde.

Schauen Sie sich das Gesamtbild Ihres Problems an. Was versuchst du wirklich zu lösen?

Wenn Sie versuchen zu lösen, dass "die Ausgabe meines Programms immer in ein anderes Programm geleitet werden muss", dann müssen Sie den Benutzer nicht dazu veranlassen, die obskure Prozessersetzung von bash zu verwenden. Was ist, wenn die Standardshell auf ihrem System zsh ist? Bourne-Schale? Kornschale?

Lassen Sie Ihr Programm stattdessen eine Pipe, Gabel und das andere Programm ausführen.

Also, was versuchst du wirklich zu tun? Was passiert, wenn Sie, Gott verbieten, Ihre Ausgabe in eine Datei schreiben, die der Benutzer Ihres Programms übergeben hat, und nicht in eine von bash erstellte FIFO?

Ich stimme zu, diese Forderung ist ein wenig dunkel. Leider kann ich es nicht ändern, da es sich bei der Anwendung um einen Softwaresimulator handelt, der das Verhalten einer anderen Anwendung emuliert, die auf einer Hardware eingebettet ist. Die von ihr emulierte Anwendung wurde nicht von mir geschrieben und ich kann ihre Argumentstruktur nicht ändern. Da die Anwendungsfälle für einen solchen Simulator ziemlich begrenzt sind, ist es unwahrscheinlich, dass dies ein Problem darstellt. Ich habe mich nur gefragt, ob es einen einfachen Weg gibt, zu überprüfen (bash config file oder so). Vielen Dank! Earl Sven vor 12 Jahren 0