sieht so aus als wüsstest du nicht was threads sind oder wie man sie started, damit umgeht. Weil das programm ist eigentlich ganz gut verständlich.
google mal nach pthread tuts
hab das hier mal gefunden
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
stephan0002 schrieb:
Hallo, ist es möglich in linux, windows programme zu entwickeln ? würde bestimmt schwierig werden mit den libs die wahrscheinlich so nicht vorhanden sind, aber wine macht das ja auch irgendwie ??
Habe zzt vorhandene windows projekte die ich gerne unter linux weiterentwickeln würde, für eine IDE habe ich mich in linux noch nicht entschieden, denke mal eclipse kdevelop oder so wird es werden. Unter windows war ich mit Visual-studio unterwegs. Danke schonmal für evtl antworten. MfG Stephan
Es kommt natürlich auf Dein Projekt an.
Idealerweise hast Du Dein Projekt von anfang an plattformunabhängig entwickelt. Bei GUI beispielsweise Qt verwendet oder so. Dann kannst Du mit den normalen Linux-Mitteln das Projekt weiter entwickeln.
Wenn Du was Windows-Spezifisches machst, dann empfehle ich auf jeden Fall eine VM. Natürlich geht das mit mingw oder so, aber es bringt auch eine gewisse Komplexität bei der Entwicklung mit sich.
Nach
acl_default = acl_get_file("/var/www/test/", ACL_TYPE_DEFAULT);
kommt der Fehler ENODATA. Das sollte aber stimmen, da kein defualt entry im Ordner eingetragen ist.
Die acl_calc_mask und acl_set_file Funktion liefern hingegen EINVAL.
Alle anderen Funktionen laufen durch, ohne eine neue error number zu setzen durch.
Ethon schrieb:
nach dem fork läuft der neue Prozess. Ich glaube nicht, dass man herausbekommt, wann exec "fertig" ist.
Ich hatte die Idee einfach /proc/[pid]/exe zu checken bis da ein anderer Pfad steht. Nur ist busy waiting immer ekelig.
Was erhoffst du dir denn dadurch?
ok, ich hab die Rechte fürn Zugriff nicht angegeben...ja und ich muss natürlich auch den zeiger angeben, mit dem ich den Speicherplatz allokiert habe, den lokalen buffer hab ich nur genutzt um zu testen, weils vorher mit dem ptr_write nicht ging...ok jetzt gehts...Danke!
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?
Dieses Posting wurde automatisch erzeugt.
Hallo,
ich möchte über einen UDP-Socket eine Nachricht versenden und die Antwort darauf empfangen.
Laut Programm klappt das wohl auch, allerdings ergibt das keinen Sinn. Ich sehe im Wireshark kein UDP-Paket, habe alle Interfaces überprüft. Weder sehe ich ein gesendetes, noch eine Antwort.
Ich habe es schon versucht, über setsockopt() einzustellen, aber das scheint nicht richtig zu funktionieren.
Habt ihr da ein paar Tipps für mich?
Gruß
Ryo
€: Fehler gefunden.
Danke für die Antwort.
Nach etwas googeln und deinen Kommentaren verstehe ich das ganze nun so langsam.
Ich habe das Programm nun schon etwas erweitert und möchte aus dem Parent-Prozess so lange die Ausgaben vom Child-Prozess lesen, wie dieser lebt.
Dazu hätte ich zunächst eine do-while-Schleife mit folgender Bedingung:
while (kill(pidChild, 0) == 0);
Jedoch wird der Child-Prozess wohl nicht ganz beendet, da er ewig in dieser Schleife hängen bleibt. Kann ich im Child-Prozess am Ende irgendwie ein Kommando absetzen, dass diesen dann wirklich killt?
Denn ein wait() im Parent-Prozess geht ja nicht, ich will ja nicht auf das Beenden warten, sondern während der Child-Prozess läuft selber aktiv sein.
€: Folgendes Abbruchkriterium scheint wohl zu funktionieren:
while (readResult > 0);
Gruß
Ryo
habe mal mit den named pipes experimentiert,
allerdings unterstützen die seek befehle nicht -> sind aber zwingend
notwendig, um zb zu spulen oder auch nur teile (wie id3 tag) auszulesen, so
hab ich das jedenfalls verstanden.
kann zwar das pipe file dann kopiere, was ein funktionsfähigs .mp3 erstellt, das will ja aber nicht. öffne ich das pipe file in vlc spielt es ab, zeig aber keine id3 informationen an und zeigt fehler beim spulen...
@Einheitsmatrix
hab mir das mit LD_PRELOAD mal kurz angeschaut und begreiffs noch nicht 100%.
So wie ich das verstanden habe müsste ich den Android Media Scanner / mein MediaPlayer mit dem LD_PRELOAD neu laden? da ich ja dessen read befehle überschreiben müsste?
FUSE wird von Android leider nicht von Haus auf unterstüzt (hab jedenfalls nichts anderes gefunden)
Sooo, jetzt gehts mit den Problemen los:
Ich hab als Input ja einen std::wstring, oder einen wchar_t, wie mans nimmt, aber iconv schluckt ja nur normale char-pointer. Bei der Umwandlung von wchar_t* nach char* konnte ich beobachten dass aus "abc" jeweils "a b c " wird (leerzeichen steht für dreimal '\0'). Wie krieg ich das also so umgewandelt, dass iconv es schluckt und wie gehe ich mit der vierfachen Länge um?
Außerdem ist es hiermit
iconverter utf8_convert("UTF-8", "ISO-8859-15");
sicher nicht getan, ich gebe ja am Anfang kein ISO rein, sondern UTF16 oder 32. Eventuell besteht sogar die Möglichkeit, den vervierfachten Nullbytestring von oben hiermit abzufangen? Hier weiß ich nicht wirklich weiter...
Grüße,
Eggy
Das Beispiel ist in Ordnung. UTF-8 wurde extra ASCII kompatibel entworfen. Die ganzen Multibyte-Sachen haben alle das MSB gesetzt und es kommt daher nicht zu Verwechselung mit gültigen ASCII Zeichen.
Etwas umständlicher ist es natürlich bei nicht-ASCII Zeichen. Da nun - wie du gesagt hast - ein Zeichen mehrere Bytes benötigt. Da würde aber folgender Code funktionieren
char utf8_array[512]; // << Contains UTF8 Data
char const utf8c[] = "ü";
for (int i=0; i < 512 - sizeof(utf8c) + 1; i++){
if (memcmp(utf8_array+i, utf8c, sizeof(utf8c) - 1) == 0){
cout << "ü found!" << endl;
break;
}
}
Wenn du wirklich die einzelnen Codepoints auslesen willst, dann benutze am besten utf8-cpp oder konvertiere den String in UTF-32.
Ausprobieren, schau dir den generierten Assemblercode an. Was du wahrscheinlich suchst, ist InterlockExchange oder aehnliches fuer Linux. Sollte dein Prozessor nicht allzu alt sein, kannst du dir mit Hilfe von http://en.wikipedia.org/wiki/Compare_and_swap oder den entsprechenden Compilerintrinsics die Funktionalitaet nachbauen. Was es sonst so noch gibt: http://www.niallryan.com/node/137 , /usr/include/asm/atomic.h , http://stackoverflow.com/questions/3343589/how-do-i-use-the-lock-asm-prefix-to-read-a-value , http://www.hpl.hp.com/research/linux/atomic_ops/index.php4 . Darueber hinaus unterstuetzt der aktuelle gcc bereits atomare Operationen des neuen Standards C++0x.
Nein hab ich nicht aber diesen Pfad gibt es bei mir nicht.
Ich habe im Internet noch diesen Befehl gefunden
Task: Disable ExecShield protection
Type the following command as root user:
# sysctl -w kernel.exec-shield=0
Aber dort das gleiche er kann den Pfad bzw. die Datei nicht finden.
Also das mit der Adresse und dann einfach in den Speicher schreiben ist mal gar nicht die richtige Technik. Das Signal schon eher. Wobei anzumerken sei, dass man im Signalhandler so etwas wie printf nicht verwenden darf.
Das Stichwort ist Interprozesskommunikation, aber dass hat SeppJ ja auch schon erwähnt. Und da gibt es verschiedene Möglichkeiten wie beispielsweise Shared Memory, Pipes oder Sockets.
Eine recht einfache Variante ist einfach das lesen einer Datei. Eine Datei kann von einen anderen Prozess modifiziert werden und der zu steuernde Prozess kann diese Datei von Zeit zu Zeit lesen. Von dort kann der Wert für die Variable gelesen werden.
Wenn du mit nicht initialisierten Variablen arbeitest, betrittst du den Bereich undefinierten Verhaltens. Und da reichen schon kleine Verschiebungen (z.B. eine zusätzliche Variable), um den Default-Inhalt der Variablen (und damit die weiteren Reaktionen) zu ändern.
Es gibt einen ISO Standard für C++. Alles was dort definiert ist, ist portabel. Wenn du mehr willst, dann musst du portable Bibliotheken verwenden (zB. Boost, Qt).
Besorg dir am besten ein vernünftiges C++-Buch. zB
The C++ Programming Language | ISBN: 9780201700732
Programming: Principles and Practice Using C++ | ISBN: 9780321543721