popen in C Probleme

Diskutiere popen in C Probleme im Developer Network Forum im Bereich Hardware & Software Forum; Hi, mal wieder ein Problem und wiedermal keine wirkliche Hilfe im Inet. Hab die Funktion "popen" auf einer Seite entdeckt und irekt mal rum...
  • popen in C Probleme Beitrag #1
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hi, mal wieder ein Problem und wiedermal keine wirkliche Hilfe im Inet.
Hab die Funktion "popen" auf einer Seite entdeckt und irekt mal rum experimentiert. Leider will das Programm nach ein paar malen durchführeung keine neuen befehle annehmen. Und auch andere Funktionen in dem gleichen Programm streiken daraufhin.

fp = popen(befehl,"r");
while (fgets( line, sizeof line, fp))
{
printf("%s", line);
}
pclose(fp);
}
wobei befhel ein array ist indem der befehl gespeichert wird.
Hab mich versucht schlau zu machen, aber irgendwie. Das einzige was ich gefunden habe ist, dass da etwas von wegen blocking stand. Wäre das gleichzusetzten, mit dem verhältnis server client und dem blocking call der einfahc das Progrmam blockiert und somit keine neuen Befehle annehmen will?
Obwohl ich die pipe jedesmal dannach wieder schließe?
Oder versteh ich da was grundlegend falsch?
Danke für Hilfe
MfG
Anno1989
 
  • popen in C Probleme Beitrag #2
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Keiner eine Idee?
Schade :confused:
 
  • popen in C Probleme Beitrag #3
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
[...] Leider will das Programm nach ein paar malen durchführeung keine neuen befehle annehmen. Und auch andere Funktionen in dem gleichen Programm streiken daraufhin. [...]
Welche Befehle führst du auf diese Art aus?

Wenn ein Programm dabei ist, welches auf eine Eingabe wartet, kann es die Ausführung komplett blockieren.
 
  • popen in C Probleme Beitrag #4
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
ich führe darüber z.B. dir aus und dannahc netstat dann geht in der regel höchstens 1 bis 2 weiter befehle, dann ist schluss. Weißt du womit das zusammenhängt?
 
  • popen in C Probleme Beitrag #5
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Ohne weitere Details kann ich nicht sagen, an welcher Stelle es bei dir klemmt.
Mein Testprogramm läuft ohne diese Probleme:
Code:
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
	FILE *pipe;
	char buf[25];

	if (argc<2) return 1;

	for (int i=1; i<argc; i++)
	{
		printf("command %2i: %s\n", i, argv[i]);
		pipe = popen(argv[i], "r");
		
		while (fgets(buf, sizeof buf, pipe)) {
			printf("%s", buf);
		}
		printf("\n");
		pclose(pipe);
	}

	return 0;
}
 
  • popen in C Probleme Beitrag #6
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Ich habs ein bisschen umgeändert und jetzt klappt es. Keine Ahnung warum da vorher Probleme auftraten.
Danke schön.
Ich benutze von deinem programm momentan:
Code:
for (int i=1; i < 2; i++)
	{

		pipe = popen(befehl, "r");

		while (fgets(line, sizeof line, pipe)) {
			printf("%s", line);
		}
		printf("\n");
		pclose(pipe);
	}
 
  • popen in C Probleme Beitrag #7
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Die for-Schleife kannst du weglassen. :)
 
  • popen in C Probleme Beitrag #8
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Ja, stimmt, bei mir war argv[] irgendwie dauernd kleiner 2, was bedeutet das genau?^^
 
  • popen in C Probleme Beitrag #9
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

in argv[0] steht der Programm-Name, in argv[1] das erste Argument, in argv[2] das zweite Argument usw. usf.

Nic
 
  • popen in C Probleme Beitrag #10
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Ich habe einfach die auszuführenden Programme als Argumente übergeben, um das Verhalten zu testen. So etwa:
test dir "netstat -n" "ipconfig -all"

Das hat dann folgendes ergeben:
argv[1] = dir
argv[2] = netstat -n
argv[3] = ipconfig -all

Nur dafür ist die for-Schleife zuständig. Die Abbruchbedingung vor der Schleife habe ich eingebaut, damit das Programm gleich beendet wird, wenn man keine Argumente (und somit Befehle zum Ausführen) beim Aufruf übergibt.
 
  • popen in C Probleme Beitrag #11
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Alles klar, jetzt hab ichs verstanden. Kann man in dieser pipe auch Befehlsteile aneinanderfügen? Also in etwa (klappt ja nicht) :

pipe = popen(befehl "dir", "r");

das in dme array befehle z.B. eine reihe von "cd ... "befhelen dirn sind und dann dir angehängt wird nachdem dann das verzeichnis gewechselt wird?
 
  • popen in C Probleme Beitrag #12
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Ja, das geht. Allerdings musst du das Format verwenden, welches deine Shell zum Verketten von Befehlen kennt.

Unter Windows geht's z.B. so:
cd .. & cd .. & dir

Das wäre zu vergleichen mit:
dir ..\..

Sowas geht natürlich auch:
netstat -n|find "HERGESTELLT"

Siehe Windows-Hilfe:
Symbole zur bedingten Verarbeitung
Symbole zur bedingten Verarbeitung ermöglichen es, die Ausführung von Befehlen zu steuern.

Bedingtes Ausführen von Befehlen

Symbole zur bedingten Bearbeitung ermöglichen es, mehrere Befehle von einer Befehlszeile aus zu verarbeiten und, abhängig von den Ergebnissen eines Befehls, bestimmte Aktionen durchzuführen.

  • Das kaufmännische Und (&) trennt mehrere Befehle auf einer Befehlszeile voneinander.
  • Klammern ((,)) gruppieren Befehlsblöcke.
  • Semikolons und Kommas (; ,) trennen Befehlsparameter voneinander.
  • Das Caret-Zeichen (^) setzt die besondere Bedeutung eines folgenden Befehlszeichens außer Kraft, so dass es als normales Zeichen im Text verwendet werden kann.
  • Das doppelte kaufmännische Und (&&) bewirkt, dass der Befehl nach diesem Zeichen nur dann ausgeführt wird, wenn der vorhergehende Befehl erfolgreich war.
  • Das doppelte Pipe-Zeichen (||) bewirkt, dass der Befehl nach diesem Zeichen nur dann ausgeführt wird, wenn bei der Ausführung des vorhergehenden Befehls ein Fehler aufgetreten ist.
 
  • popen in C Probleme Beitrag #13
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Also funtkioniert quasie alles was in DOS funktioniert, gut danke, hab also an der falschen stelle gesucht. Ab jetzt such ich bei sowas in DOS Befehlverzeichnissen nicht mehr in irgendwlechen Tutorials. :ja: ;)
 
  • popen in C Probleme Beitrag #14
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Wenn du mit "DOS" die Konsole meinst, dann kann ich dem zustimmen. Ansonsten nicht, denn DOS hat damit wenig zu tun.

Alles was in DOS funktioniert, wirst du unter Windows in der Form nicht hinbekommen. DOS lässt z.B. immer direkten Zugriff auf die Hardware zu. Versuche das mal mit einem Userspace-Programm in der Konsole. ;)
 
  • popen in C Probleme Beitrag #15
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, ja ich meine die Eingabeaufforderung in Windows XP, kenne da die Differenzierung und auch die Fachwörter nicht zu. Was ist ein Userspace Programm?
 
  • popen in C Probleme Beitrag #16
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
[...] Was ist ein Userspace Programm?
Das ist eine Anwendung, die im User Mode läuft läuft und somit keinen direkten Zugriff auf die Hardware hat. Dieser Zugriff ist bei aktuellen Betriebssystemen dem Kernel Mode vorbehalten. Hier wird's auch ein wenig erläutert.

Ich wollte damit nur andeuten, dass DOS etwas ganz anderes ist, als die Konsole. Es sieht zwar ähnlich aus, aber das waren dann auch schon die Gemeinsamkeiten. ;)
 
  • popen in C Probleme Beitrag #17
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Gut, okay habs verstanden zumindest das was in dme Link stand.
[...]Versuche das mal mit einem Userspace-Programm in der Konsole.;)
Was genau soll ich denn da jetzt ausprobieren?
 
  • popen in C Probleme Beitrag #18
Z

Zombie79

Bekanntes Mitglied
Dabei seit
05.10.2001
Beiträge
6.132
Reaktionspunkte
2
Einen direkten Zugriff auf die Hardware durchführen. Zum Beispiel auf eine bestimmte I/O-Adresse zugreifen oder einen IRQ (z.B. 13h für einen Disk-Zugriff) auslösen. So, wie man unter DOS damals programmiert hat.

Aber das brauchst du nicht ausprobieren, weil es sowieso nicht klappen würde. Deswegen habe ich auch den ;) Smiley angefügt.

Es ging mir um den Unterschied zwischen DOS und Konsole. Das hat mit dem eigentlichen Thema nichts zu tun.
 
  • popen in C Probleme Beitrag #19
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Gut, okay, nein aber dne unterschied hab ich nun glaube ich verstanden ;)
 
Thema:

popen in C Probleme

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben