Zum Inhalt springen

stronzo

Mitglieder
  • Gesamte Inhalte

    14
  • Benutzer seit

  • Letzter Besuch

  1. Ok, das mit den handles hab ich soweit hinbekommen. das prgramm nimmt den userinput entgegen und arbeitet dann die erzeigten Threads ab und beendet dann das ganze prog, funzt auch soweit. Nur ich möchte ja dass das Programme immer wieder userinput entgegennimmt ohne dass ich jedesmal das Prog neustarten muss. Also muss eine Endlosschleife her die dann in bestimmten Fällen abbricht. Hab folgende Schleife erzeugt: for(; { printf("\nBitte Enter drücken ..."); getchar(); WriteFile(hClientIn_wr,"dir",1024,&ignore,NULL); CloseHandle(hClientIn_wr); while(ReadFile(hClientOut_rd,buffer,255,&x,NULL) && GetLastError() != ERROR_BROKEN_PIPE) fwrite(buffer,x,1,stdout); fflush(stdout); CloseHandle(hClientOut_rd); } [/PHP] Jetzt wird allerdings "dir" nur einmal ausgeführt und dann wird die cmd geschlossen. Wo liegt der Fehler ? So erzeug ich den Prozess: [PHP] if(!CreateProcess(NULL,"cmd",NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL,NULL,&si,π)) { printf("Prozess erstellung fehlgeschlagen\n"); exit(5); } Ausgabe der console: D:\cygwin\home\user\child>pipe.exe Bitte Enter drücken ... << Jetzt drück ich Enter Microsoft Windows XP [Version 5.1.2600] © Copyright 1985-2001 Microsoft Corp. D:\cygwin\home\user\child>Mehr? Datenträger in Laufwerk D: ist Programme Volumeseriennummer: E46C-7E63 Verzeichnis von D:\cygwin\home\user\child 04.03.2005 10:37 <DIR> . 04.03.2005 10:37 <DIR> .. 03.03.2005 12:09 1.867 child.c 03.03.2005 12:09 14.902 child.exe 10.11.2004 14:35 1.140.617 cygwin1.dll 04.03.2005 08:46 2.262 my_shell.c 04.03.2005 08:46 16.771 my_shell.exe 04.03.2005 10:36 5.228 pipe.c 04.03.2005 10:37 17.103 pipe.exe 04.03.2005 08:39 1.503 test.c 04.03.2005 08:39 14.902 test.exe 9 Datei(en) 1.215.155 Bytes 2 Verzeichnis(se), 33.588.670.464 Bytes frei D:\cygwin\home\user\child>Mehr? << Wo kommt das Mehr? her ?? Bitte Enter drücken ... Bitte Enter drücken ... << Jetzt drücke ich wieder Enter aber nix passiert Bitte Enter drücken ... Bitte Enter drücken ... Bitte Enter drücken ... Thx
  2. ich hab jetzt die Handles so gesetzt: HANDLE pipe_in,pipe_out; CreatePipe(pipe_in,pipe_out,0,0); si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = pipe_in; si.hStdOutput = pipe_out; si.hStdError = pipe_out; müsste doch eigentlich reichen, oder ? bekomme trotzdem noch die selbe fehlermeldung bei laufzeit. ich brauch dringend hilfe, bzw code beispiele zu Handels und deren umgang. Möglichst in Deutsch, da mein englisch nich das beste ist. Thx
  3. Hmm, habe jtzt mal versucht HANDEL auf STDOUT zu setzen. Compiler meldet keine Fehler aber es gibt einen Runtime error: 3 [main] child-test 3888 handle_exceptions: Exception: SATUS_ACCESS_VIOLATION Fogender Code: #include <stdio.h> #include <windows.h> #include <stdlib.h> void main() { char buffer[255]; // Puffer STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( π, sizeof(pi) ); // Fenster nicht sichtbar si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE; // Ausgabe umleiten HANDLE pipe_wr,pipe_rd; CreatePipe(pipe_rd,pipe_wr,0,0); si.dwFlags|=STARTF_USESTDHANDLES; si.hStdOutput=pipe_wr; // ReadFile(pipe_rd , buffer , 123 , ... ) Bildschirm ausgaben lesen // Starte den child process. if( !CreateProcess( NULL,"cmd.exe",NULL,NULL,TRUE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&si,π ) ) { printf("CreateProcess failed."); exit(1); } DWORD x; // Solange lesen, bis die Pipeline von der anderen Seite geschlossen wird while(ReadFile(pipe_rd,buffer,255,&x,NULL) && GetLastError() != ERROR_BROKEN_PIPE) printf("%s",buffer); // eigenes Handle schliessen CloseHandle(pipe_rd); DWORD dwExitCode; do { GetExitCodeProcess(pi.hProcess,&dwExitCode); } while (dwExitCode == STILL_ACTIVE); if (dwExitCode != STILL_ACTIVE) printf("beeendet"); // Schließe process und thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } [/PHP] Was hab ich falsch gemacht??? Thx
  4. Upps, hast recht, hab im falschen forum gepostet. Das mit STARTUPINFO hab ich mir gedacht, hatte ich wo gelesen. Das folgende Programm startet "cmd.exe" und wartet dann bis es beendet wird. Wie kann ich die HANDLE für Stdin/Stdout/Stderr setzen ? idee für diesen code: cmd.exe soll offen gehalten werden und ich geb den Input (z.B. dir y:) in meiner anderen anwednung (welche cmd.exe gestartet hat) ein und der output (z.B: Das System kann den angegebenen Pfad nicht finden.) wird im fenster der anwendung gezeigt. #include <windows.h> #include <stdio.h> int main() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( π, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line). "cmd.exe", // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. π ) // Pointer to PROCESS_INFORMATION structure. ) { printf( "CreateProcess fehlgeschlagen." ); exit(1); } DWORD dwExitCode; do { GetExitCodeProcess(pi.hProcess,&dwExitCode); } while (dwExitCode == STILL_ACTIVE); if (dwExitCode != STILL_ACTIVE) printf("beeendet"); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } [/PHP]
  5. Hy, habe folgendes Problem. Ich möchte aus einem C Programm heraus eine Konsolenanwendung starten, welche wiederum auf Eingabe wartet und diese Verarbeitet. Die 2. Anwendung soll geöffnet gehalten werden und aus der 1 Anwendung erfolgt immer neuer Input in die 2. Anwendung. Das was das 2. Konsolenprogramm normalerweise in der dosbox ausgeben würde, durch den Input von Anwenung 1, soll jetzt in die 1. Anwendug geleitet und dort weiterverarbeitet werden. Also brauch ich Pipes ! Ist CreateProcess() da die richtige Lösung ? Kann mir da einer nen Beispielcode zeigen, an dem ich mich Orientieren kann ? Wenn es geht bitte mit vielen Kommentaren. Danke
  6. Danke. Wie kann es sein, das jemand wie du ( hab deine Page begutachtet ) Arbeit sucht? Du müsstest doch Arbeitsstellen on maß bekommen.
  7. OK, danke. Fehler behoben. Das mit Zeigern und Arrays hab ich noch nicht ganz begriffen. Bzw. was ein Zeiger ist weiß ich: Ein Zeiger zeigt auf die Adresse in der der Wert gespeichert wird/wurde. Und was genau ist ein Array ? Hat mir dazu jemand weiterführende Lektüre ? Thx
  8. Ich hab jetzt versucht den obeigen code in eine einzige main() zu quetschen. Der Compiler meldet keine Fehler, allerdings bekomme ich jetzt beim ausführen "Segmentation fault (core dumped)". Wo liegt im folgenden Code der Fehler ? int main(int argc, char **argv) { FILE* datei; FILE* datei2; char inhalt[1024]; char nstr[100]; char* const_str; char* temp_str; char* erstePos; if(argc < 2) { printf("Eine Neue Nachricht musst du schon angeben!!!\n"); return 0; } datei = fopen("stronzo.txt", "r"); /* Öffnet Datei zum lesen */ datei2 = fopen("temp.txt", "w+"); /* Öffnet Datei2 zum schreiben */ strcpy(nstr,argv[1]); /* Kopiert argv[1] in nstr */ strcpy(const_str,"nachricht"); /* Kopiert nachricht in const_str */ while(fgets(inhalt, 1024, datei)) { erstePos = strstr(inhalt,const_str); /* Sucht nach const_str in inhalt */ strcpy(temp_str,const_str); /* Kopert const_str in temp_str */ strcat(temp_str, " "); /* Hängt ein Leerzeichen an temp_str an */ strcat(temp_str, nstr); /* Hängt nstr an temp_str an */ strcat(temp_str, "\n"); /* Hängt einen Zeilenumbruch an temp_str an */ if(erstePos != NULL) strncpy(erstePos, temp_str, 256); /* Ersetzt erstePos in Inahlt mit temp_str */ printf("%s", inhalt); /* Gibt inhalt auf dem Bildschirm aus */ fputs(inhalt,datei2); /* Speichert inhalt in datei2 */ } fclose(datei); /* Schließt datei */ fclose(datei2); /* Schließt datei2 */ remove("stronzo.txt"); /* Löscht stronzo.txt */ rename("temp.txt","stronzo.txt"); /* Benennt temp.txt zu stronzo.txt */ return 0; } [/PHP]
  9. Muchas Grazias!!! Ihr seit spitze. :uli Freu mich schon auf meine Bücher 1000 Dank.
  10. Habs jetzt fast komplett hinbekommen, mir fehlt nur noch eine sache. Ich möhte dass der User dem Programm einen Neuen String übergeben kann, welcher dann an der Stelle eingesetzt wird. Wie der User Input machen kann is mir klar, nur wie bekomm ich dann den kompletten string in eine neue Variable geschrieben? also z.B: replace.exe Hallo ich bin John. strcpy(new_str,argv[1]); würde ja lediglich das erste Wort (Hallo) in new_str schreiben. Was muss ich statt argv[1] schreiben um Hallo ich bin John. in new_str zu bekommen? THX
  11. Ja, "nachricht" steht immer am anfang der zeile. Mehr an vereinfachungen wüsste ich leider nicht. Die Zeile in der es steht kann leider variieren.
  12. Nehmen wir einmal an ich habe was.txt mit jedemenge Zeilen: ... was geht von wo nachricht "Hallo du" von wegen ... Die Zeile die ich ersetzten möchte ist: nachricht "Hallo du" Und sie soll ersetzt werden mit: nachricht Ich hab kein Plan Die Zeile mit "nachricht" kommt nur einmal in der was.txt vor. Das "nachricht" soll erhalten werden und nur der Text dahinter bis zum Zeilenende soll geändert werden. Und da unter der zeile mit "nachricht" ja wieder Text steht muss das ja dann in eine neue Datei geschrieben werden und die Alte mit der Neuen ersetzt werden. Kann mir dazu jemand ein Codebeispiel in C geben? Ich versteh es eher wenn ich ein Codebeispiel sehe. Ich hab mir jetzt auch 2 Bücher zum C Programmieren bestellt um euch nicht mit solchen Fragen zu belästigen, allerdings sind die erst Ende nächster Woche da. Und ich brauch den Code schon gestern. Vielen Dank.
  13. Mein Problem liegt darin, dass ich nich weiß wie das mit dem ersetzten von den zeilen und dem schreiben der neuen datei hinbekomm. Das folgende is wie ich die Datei öffne (war auch nich einfach mit null ahnung): void test(const userinput * const u) { FILE *bkp = fopen("test.txt","r,w");; char *tempstr; tempstr = mycalloc(maxtextlength); while(fgets(tempstr,maxtextlength,bkp_ptr) != NULL) { u_respond(u," %s ",tempstr); } fclose(bkp_ptr); mydelete(tempstr); }
  14. Hallo Leute, ich bin am verzweifeln. Ich suche schon die ganze Nacht nach einer Lösung, kann aber keine finden die ich verstehe Ich muss über ein C Programm gewisse Zeilen in einer Textdatei ändern. Nehmen wir an die datei heist test.txt und sie enthält neben vielen andern Zeilen eine Zeile: ..... nachricht "hallo" ..... Ich möchte daß das Prog nun das "Hallo" durch einen Text ersetzt den ich dem Prog übergebe. Ich hab irgendwo gelesen dass man die Datei auslesen muss sie in eine variable speichert, die gewünschten zeilen ändert, in eine neue Datei schreibt und dann die alte Datei ersetzt. Meine Frage, WIE STELLT SO EIN DUMMER NEWBIE WIE ICH DAS AN ??? Bitte ausführlich wenns geht. Danke im vorraus.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...