pipe
-
Hallo Forum,
gibt es eine alternative fuer die funktion pipe(Linux) unter win32, mit den selben eigenschaften? Habe bis jetzt noch nix gefunden.
mfg Olli.
-
vermute mal das hier wird dir weiterhelfen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/pipes.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/createpipe.asp
-
Da gibt es doch was, super - genau das suche ich, danke.
mfg Olli.
-
Teste grade das lesen und schreiben in PIPE.
Was mir auffaellt, wenn nix mehr geschrieben wird und versuche weiter
auszulesen, bleibt der bei ReadFile stehen (Blocking?).if (!ReadFile ((HANDLE) fd, data, maxlen, &ret, NULL) || ret == 0) break;Gibt es eine Loesung?
mfg Olli.
-
Was mir auffaellt, wenn nix mehr geschrieben wird und versuche weiter
auszulesen, bleibt der bei ReadFile stehen (Blocking?).Ja, ReadFile Blockiert, weil fd nicht auf nonblocking gestellt ist.
Nun habe ich mit ioctlsocket getestet, aber ohne erfolg.
Ist es ueberhaupt möglich PIPE auf nonblocking zustellen?mfg Olli.
-
Hier ist mal ein Beispiel Code, so wie er aussehen koennte.
Nach den 10. Schreiben bleibt der bei ReadFile haengen, solange bis
man wieder mit WriteFile schreibt. ReadFile soll aber weiterhin pruefen
ob Zeichen anliegen.#include <stdio.h> #include <windows.h> HANDLE watch_dog[2]; char data[1] = "\0"; int maxlen = 1; int pipe(HANDLE Handle[2]) { SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; if (! CreatePipe(&Handle[0], &Handle[1], &saAttr, 0)) return(EOF); return(TRUE); } int WritePipe(void) { DWORD ret = 0; static int task = 0; if (task < 10) { if (! WriteFile(watch_dog[1], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); ++task; } return(ret); } int ReadPipe(void) { DWORD ret = 0; if (! ReadFile(watch_dog[0], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); return(ret); } DWORD main(void) { DWORD ret = 0; if (pipe(watch_dog) < 0) { printf("Pipe konnte nicht erstellt werden\n"); return(FALSE); } while(1) { Sleep(1000); printf("Schreibe Wert: %d\n", ret = WritePipe()); ret = 0; printf("Lese Wert: %d\n", ret = ReadPipe()); } return(FALSE); } Code: #include <stdio.h> #include <windows.h> HANDLE watch_dog[2]; char data[1] = "\0"; int maxlen = 1; int pipe(HANDLE Handle[2]) { SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; if (! CreatePipe(&Handle[0], &Handle[1], &saAttr, 0)) return(EOF); return(TRUE); } int WritePipe(void) { DWORD ret = 0; static int task = 0; if (task < 10) { if (! WriteFile(watch_dog[1], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); ++task; } return(ret); } int ReadPipe(void) { DWORD ret = 0; if (! ReadFile(watch_dog[0], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); return(ret); } DWORD main(void) { DWORD ret = 0; if (pipe(watch_dog) < 0) { printf("Pipe konnte nicht erstellt werden\n"); return(FALSE); } while(1) { Sleep(1000); printf("Schreibe Wert: %d\n", ret = WritePipe()); ret = 0; printf("Lese Wert: %d\n", ret = ReadPipe()); } return(FALSE); } Code: #include <stdio.h> #include <windows.h> HANDLE watch_dog[2]; char data[1] = "\0"; int maxlen = 1; int pipe(HANDLE Handle[2]) { SECURITY_ATTRIBUTES saAttr; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; if (! CreatePipe(&Handle[0], &Handle[1], &saAttr, 0)) return(EOF); return(TRUE); } int WritePipe(void) { DWORD ret = 0; static int task = 0; if (task < 10) { if (! WriteFile(watch_dog[1], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); ++task; } return(ret); } int ReadPipe(void) { DWORD ret = 0; if (! ReadFile(watch_dog[0], data, maxlen, &ret, NULL) || ret == 0) return(FALSE); return(ret); } DWORD main(void) { DWORD ret = 0; if (pipe(watch_dog) < 0) { printf("Pipe konnte nicht erstellt werden\n"); return(FALSE); } while(1) { Sleep(1000); printf("Schreibe Wert: %d\n", ret = WritePipe()); ret = 0; printf("Lese Wert: %d\n", ret = ReadPipe()); } return(FALSE); }Der Code soll spaeter fuer ein watchdog dienen.
mfg Olli.