auf console bzw consolenprogramm zugreifen...
-
also... in linux liegen ausführbare programme im ordner /usr/bin (normal)
wenn ich ein best. programm ausführen will muss ich in der console den namen eingeben und erhalte prog-bedingt informationen-etc....
ich wollte ein qt programm schreiben und wissen wie man diese informationen einliest und ob der befehl für consolenbefehle auch wie bei windowssystem("...");
ist.
kennt vielleicht einer einen link zum thema???
-
system ist Standard-C, gibts also auch unter Unix.
Aber schau Dir mal man: popen(3) an, das wäre wohl praktisch für Dich.
-
Zu system hab ich nur ein dazu sagen: system is bad
-
dgrat schrieb:
also... in linux liegen ausführbare programme im ordner /usr/bin (normal)
wenn ich ein best. programm ausführen will muss ich in der console den namen eingeben und erhalte prog-bedingt informationen-etc....
ich wollte ein qt programm schreiben und wissen wie man diese informationen einliest und ob der befehl für consolenbefehle auch wie bei windowssystem("...");
ist.
kennt vielleicht einer einen link zum thema???Wenn du schon bei Qt bist, solltest du dir die Klasse QProcess anschauen.
-
danke für die antworten...
angenommen das programm erfordert root rechte und ich kenne das pw, würde ich gefragt werden oder wie kann ich mich vorher als root anmelden ohne system zu nutzen?
-
ich hab eienen beispielcode gefunden... allerdings weiß ich nicht was:
popen( "dir *.c /on /p", "rt" )) == NULL
macht??? fehlt eigentlich nur noch root berechtigung. wie müsste man das mit QProcess machen, Ponto?
#include <stdio.h> using namespace std; int main(int argc, char *argv[]) { char buffer[128]; FILE *startadsl; FILE *stopadsl; FILE *eaglestat; /* Run DIR so that it writes its output to a pipe. Open this * pipe with read text attribute so that we can read it * like a text file. */ if( (eaglestat = popen( "dir *.c /on /p", "rt" )) == NULL ) exit( 1 ); /* Read pipe until end of file. End of file indicates that * CHKDSK closed its standard out (probably meaning it * terminated). */ while( !feof( eaglestat ) ) { if( fgets( buffer, 128, eaglestat ) != NULL ) printf( buffer ); } /* Close pipe and print return value of CHKDSK. */ printf( "\nProcess returned %d\n", pclose( eaglestat ) ); return EXIT_SUCCESS; }
-
dgrat schrieb:
angenommen das programm erfordert root rechte und ich kenne das pw, würde ich gefragt werden oder wie kann ich mich vorher als root anmelden ohne system zu nutzen?
Sowas löst man mit sudo oä.
-
und was macht
popen( "dir *.c /on /p", "rt" )
wo findet man da ma ne auflistung an befehlen
-
dgrat schrieb:
und was macht
popen( "dir *.c /on /p", "rt" )
wo findet man da ma ne auflistung an befehlen
popen hat eine manpage
-
richtig geholfen.. naja, ich hab es aber zum teil doch noch geschafft...
aber auf den prozess scheint doch nicht nur read only zugegriffen zu werden und allgemein ist das verhalten merkwürdig... erst nach ein paar enter eingaben wird was angezeigt usw... könnte es vielleicht jemand ausprobieren und vielleicht auf die root frage antworten.... da ich ähnlich wie bei yast so eine abfrage haben will... plz#ifdef HAVE_CONFIG_H #include <config.h> #endif #include <iostream> #include <cstdlib> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { char buffer[8086]; FILE *glx; glx = popen( "fglrxconfig", "r" ); if(glx == NULL) { fprintf(stderr,"Konnte keine Pipe zu fglrx erstellen!\n"); exit(0); } /* Read pipe until end of file. End of file indicates that * FILE closed its standard out (probably meaning it * terminated). */ while( !feof( glx ) ) { if( fgets( buffer, 8096, glx ) != NULL ) printf( buffer ); } /* Close pipe and print return value of FILE. */ printf( "\nProcess returned %d\n", pclose( glx ) ); return EXIT_SUCCESS; }
-
bevor ich es cergesse ich bin anfänger d.h hobbymäßig aktiv.. da wären forumposts ala
Sowas löst man mit sudo oä.
ein bissel fehl am platz... außerdem ist sudo best. nicht was ich will, oder?
-
Hi,
dgrat schrieb:
ein bissel fehl am platz... außerdem ist sudo best. nicht was ich will, oder?
man (ich tue das zumindest) macht sich von jemandem, der hier postet, ein gewisses Bild und stuft ihn und seine Kenntnisse, aufgrund mancher Stichworte, irgendwo ein. Wenn also jemand schreibt, dass er mit Qt programmiert, ein Menu a la Yast haben möchte etc, gehe ich davon aus, dass er sudo zumindest schonmal gehört hat bzw. recht schnell herausbekommt, was der Befehl tut. Deswegen fand ich den Satz von nman keineswegs fehl am Platze.
Oder hab ich deinen Satz falsch verstanden?
-
dgrat schrieb:
bevor ich es cergesse ich bin anfänger d.h hobbymäßig aktiv.. da wären forumposts ala
Sowas löst man mit sudo oä.
ein bissel fehl am platz...
Also wenn Du Programmierer bist, dann sollte man davon ausgehen dürfen, dass Du fähig bist, man: sudo zu lesen oder apropos sudo zu machen oder mal nach sudo zu googeln.
Dass ich hier keine hochdetaillierte Anleitung gebe sondern nur Hilfe zur Selbsthilfe halte ich übrigens auch für selbstverständlich.außerdem ist sudo best. nicht was ich will, oder?
Doch, ich denke schon. (Sonst hätte ich die Antwort aber auch nicht gegeben.)
-
ihr habt recht...
dann frag ich anders wie würdet ihr sudo in den obigen code einbauensudo - execute a command as another user
und noch viel wichtiger warum tritt vorher genannter fehler auf
The command argument is a pointer to a null-terminated string contain-
ing a shell command line. This command is passed to /bin/sh using the
-c flag; interpretation, if any, is performed by the shell. The type
argument is a pointer to a null-terminated string which must be either
'r' for reading or `w' for writing.
-
dgrat schrieb:
dann frag ich anders wie würdet ihr sudo in den obigen code einbauen
Gar nicht, das gehört da nicht rein, Du führst das Progamm dann einfach vom UserAccount aus via sudo als root aus.
und noch viel wichtiger warum tritt vorher genannter fehler auf
Welcher Fehler denn?
-
wenn du fglrxconfig kennst, weißt du vielleicht das mann ein paar einstellungen vornehmen muss und dadurch eine xconfig erzeugt.
nun, wenn ich das prog über mein letztes code posting ausführe, dann zeigt mir die ausgabe erst mal nichts an!
wenn ich ein paar mal enter drücke, dann den normalen dialog, als wenn ich das programm normal gestartet hätte.
dann sind noch eingaben möglich...
auf der einen seite ist es positiv das der prozess gestartet wird, aber ich dachte mit dem argument "r" wird nur lesend geöffnet. und mit "w" dann schreibend....
und der array buffer wer dann nur der eingelesene text... da ja in der man page stand das standart sreams verwendet werden...und zu sudo: ich wollte eigentlich eine art "konquerer im root modus abfrage"
noch ma der code
#ifdef HAVE_CONFIG_H #include <config.h> #endif #include <iostream> #include <cstdlib> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { char buffer[8086]; FILE *glx; glx = popen( "fglrxconfig", "r" ); if(glx == NULL) { fprintf(stderr,"Konnte keine Pipe zu fglrx erstellen!\n"); exit(0); } /* Read pipe until end of file. End of file indicates that * FILE closed its standard out (probably meaning it * terminated). */ while( !feof( glx ) ) { if( fgets( buffer, 8096, glx ) != NULL ) printf( buffer ); } /* Close pipe and print return value of FILE. */ printf( "\nProcess returned %d\n", pclose( glx ) ); return EXIT_SUCCESS; }
-
Ich verstehe nicht, warum Du das nicht mit einem simplen Shellscript löst.
Und KDE verwendet IIRC einfach kdesu.
-
Hab mir den Code jetzt auch mal angesehen, sieht eigentlich ganz ok aus und funktioniert bei mir mit fortune auch recht gut; fglrxconfig wird wohl auf ein paar Eingaben warten, dafür ist popen natürlich nicht geeignet; Pipes sind unidirektional.
btw: Warum bindest Du C++-Header ein, wenn Du ganz straightes C programmierst?