ja, sorry. beu mir kam aber auch nichts vernünftiges raus, wenn der thread was gemaacht hat. In diesem Falle rechnet mit 16 Threads ein Strömungsproblem. Während unter Windoof mit clock die richige Zeit z.B. 8s pro Thread rauskommt, sind es unter Linux 16*8 also 128 sec.
Und mit CLOCK_THREAD_CPUTIME_ID 1.e-15
Einen Keylogger schreibt man in der Regel als Kernelmodul. Das wirst du mit Wine nicht testen können. Du könntest wohl höchstens Windows unter Virtual Box oä. installieren und da entwickeln.
morphd schrieb:
Tut es leider nicht. Auch gdb meckert nicht.
Warum sollte gdb meckern? Du rufst eine Funktion auf und erhälst einen Rückgabewert. Das dieser Rückgabewert einen Fehlercode darstellt ist dem gdb doch egal. Die Funktion wurde korrekt aufgerufen.
Möglicherweise versuchst Du eine Datei von einem Dateisystem zum anderen zu bewegen. Das geht mit rename(2) nicht. Das geht nur manuell. Also alte Datei öffnen, neue Datei anlegen, Daten von der alten Datei in die neue schaufeln, beide Dateien schliessen und alte Datei löschen. Eventuell die Attribute der neuen Datei noch anpassen.
Die Pthreads bieten mit der Barrier ein geniales Instrument zur Synchronisation von Threads: ich erzeuge eine Barrier mit einem Zählerwert und lasse dann verschiedene Threads auf eine Barrier-Wait-Funktion laufen. Diese gibt erst dann alle Threads wieder frei, wenn der Zählerwert erreicht ist, d.h. wenn die entsprechende Anzahl Threads dort angekommen ist.
Die Barrier hat aber einen entscheidenden Nachteil: ich muss bei der Initialisierung bereis wissen, auf wie viele Threads ich warten will. Da die bei mir dynamisch erzeugt werden, klappt das mit der Barrier so nicht, auch ein manipulieren der pthread_barrier_t-Membes wäre ziemlich unsauber und würde Probleme machen.
Was bleibt mir also übrig, gibt es eine dynamischere Alternative zu dieser Barrier oder wie kann ich das sonst realisieren?
Um nochmal auf meinen eigenen Beitrag einzugehen:
Das SA_RESTART hat mir im Endeffekt zu viele abstruse Ergebnisse an den unterschiedlichsten Stellen in meinem Programm gebracht.
Ich habe dieses Flag jetzt wieder rausgenommen, um bei verschiedenen Socket-Syscalls selbst auf EINTR zu prüfen.
Da aber offensichtlich der errno nicht auf 0 (Success) gesetzt wird wenn ein Syscall erfolgreich durchläuft, ergab sich das Problem dass bspw. das select() - wenn mein Init-Script zum Beenden des Programms das Signal SIGTERM sendet - trotz Select-Timeout in einer Endlos-Schleife verharrt, bis mein Init-Script einen eigenen Timeout erreicht und SIGKILL sendet.
Ich muss also erkennen wann der Syscall wirklich fertig geworden ist und dann die Schleife ggf. verlassen.
Dazu wollte ich erst eine Variable, die den Return-Wert nimmt, auf -2 setzen und im "Schleifenfuß" auf "var != -2" prüfen, musste aber feststellen dass Syscalls (oder zumindest select() ) auch dann einen Return-Wert zurückliefern wenn sie unterbrochen werden.
Deswegen setze ich den errno jetzt immer am Beginn der Schleife manuell auf 0:
int iRet;
do
{
errno = ESUCCESS;
iRet = connect(m_fdSocket, (struct sockaddr*)&m_destAddr, sizeof(struct sockaddr_in)) ;
}
while( EINTR == errno );
/* ... */
do
{
errno = ESUCCESS;
iRet = select(m_fdSocket+1, NULL, &wfds, NULL, &timeout);
}
while( EINTR == errno );
Das scheint mir bisher genau das Verhalten zu liefern das ich mir von meinem Programm erwartet hatte. Und damit wäre das Problem meines Threads erstmal gelöst.
Würd mich weiterhin über Ideen oder Überlegungen freuen
Also hab jetzt viel recherchiert und steh immer noch da wo ich hier aufgehört hab, also bei dem curlpp has not been declared Fehler!
Die lib ist wie gesagt compiled, fehlerfrei! Außerdem hab ich unter /usr/local/lib/pkgconfig/ die datei curlpp.pc gefunden, sagt das jemand was oder kann ich damit was machen? Kenn mich überhaupt nicht mit pkgconfig aus
Was ich eigentlich machen will: Ich schreibe ein Programm das Webseiten downloaden soll und daraus gewisse Informationen herausfiltert... Wie würdet ihr das Webseiten downloaden realisieren? Auch mit cURLpp oder kennt ihr noch andere (leicht zu benutzende)?
Vielen Dank für Tipps und Hilfen :xmas1: :xmas1:
[MOP]
_Hannes schrieb:
Headerdateien wie socket.h sind ja Unix-spezifisch und nicht Windows-spezifisch, daher ist es bei cygwin nicht dabei... hab gelesen, dass man einen Cross-Compiler installieren muss, damit man zum Ziel kommt...
Wenn jmd mir ein paar Tipps geben kann wie man von einem Windows-System (in dem ich gern programmieren würde) auf ein Embedded Linux (läuft auf einem ARM Controller) kommt, wäre ich sehr dankbar.
Gruß
Hannes
cygwin bietet eine komplette Posix-API. Dafür ist cygwin ja gemacht. Und damit musst Du auch eine socket.h haben. Du musst natürlch das entsprechende Modul installieren. Unter (Ubuntu 9.10-)Linux braucht man beispielsweise die libc6-dev.
Bringt nichts. Beim SegFault werden keine Destruktoren ausgeführt. Ohne SegFault ist RAII allerdings schon sinnvoll. Dazu darf das Programm allerdings nicht gekillt(SIGKILL) werden sondern nur teminiert(SIGTERM), weil man nur letzteres abfangen und damit geordnet runterfahren kann.
Ist eventuell Systemabhängig und auch von der jeweilgen Anwendung, denke ich mal. Einfach mal ne Version mit und ohne schreiben und mit time zumindest die Laufzeit messen.
Nicht mit der Standardbibliothek. Mit Boost.Filesystem kannst du das bestimmt checken, mit Betriebsystemsachen ebenso, aber welche das für Windows sind weiß ich nicht. Für Unices kannst du das mit stat machen.