Hab den Fehler selber gefunden.
Nach der if-Anweisung in der Makefile.am darf es kein TAB Zeichen geben.
if GUI_DEVEL_SELECTED
GUI_CFLAGS=-DGLADE_FILE_DIR=\"$(srcdir)\"
else
GUI_CFLAGS=-DGLADE_FILE_DIR=\"$(pkgdatadir)\"
endif
hat geholfen. Das war ja ein blöder Fehler nur durch Glück bin ich drauf gekommen.
@nman: danke trotzdem.
Aber der Tipp mit glob war gut, denn dann bin ich auf wordexp gekommen und das ist genau, was ich brauche.
es sollte aber nicht all zu schwer sein, eine eigene funktion für die tilde zu schreiben.
eigentlich nicht, wenn ich es mir recht überlege. Woaruf muss denn man alles beachten? ~/xxx und ~user/xxx. Mir fallen keine weitere ein, also wären nur 2 Fällen. Eine Tilde in der Mitte wird nicht als $HOME aufgelöst.
Th schrieb:
Überprüf doch mal mit readdir(), in welchem Verzeichnis du dann bist?
Ja, gute Idee, mach sowas in der Art:
struct dirent* de = readdir(folder);
if(folder != NULL)
{
printf("Komisch\n");
printf("%s", de->d_name);
}
else
perror(NULL);
ok jetzt schauts so aus ...
if (pid == 0) { /* child process */
/* no errors are reported to the caller from here on */
dup2(outfd[PIPE_WRITE], STDOUT_FILENO); /* redireceting stdout */
dup2(errfd[PIPE_WRITE], STDERR_FILENO); /* redireceting stderr */
close(outfd[PIPE_READ]); /* close reading end */
close(errfd[PIPE_READ]);
execl("/bin/sh", "sh", "-c", command, NULL); /* shell call */
LOGGER.log("CProcess::popen2", "execl failed", WARNING);
exit(0); /* if excel fails end it */
} else { /* parent */
signal (SIGCHLD, signalHandlerChild);
sleep(MAX_PROCESS_TIME);
mDidSleepWholeTime = true;
kill(0, SIGTERM);
}
close(outfd[PIPE_WRITE]); /* close writing ends */
close(errfd[PIPE_WRITE]);
files[0] = fdopen(outfd[PIPE_READ], "r"); /* return reading end to the caller */
files[1] = fdopen(errfd[PIPE_READ], "r");
if (files[0] == NULL || files[1] == NULL) {
LOGGER.log("CProcess::popen2", "fdopen failed", ERROR);
}
return pid;
}
void CProcess::signalHandlerChild (int sig)
{
pid_t statusChild = wait(0);
pause();
}
also irgendwo hab ich da noch leichte probleme, zumal er jetzt auch beim binding jammert: signal (SIGCHLD, signalHandlerChild); => error: argument of type ‘void (CProcess::)(int)’ does not match ‘void (*)(int)’, wobei aber signal definitiv als ersten parameter das signal und als zweiten die funktion nimmt?
auf was soll ich den kill jetzt richten? weil pid == 0 wäre ja das child jedoch laut doku heisst pid auf 0 bei kill "sig is sent to every process in the process group of the current process." ...
ps
icq nummer hät ich eingetragen ins profil
daAndi schrieb:
Es gibt ja den Unterschied zwischen mandatory und advisory lock.
beim advisory lock, wird nur ein lock gesetzt, hier kann ein anderes programm immer noch die Datei öffnen/schreiben/lesen...
beim mandatory lock kommt sobald ein prog versucht die gelockte datei zu öffnen eine fehlermeldung "EAGAIN" bzw. "EACCES".
als standard einstellung sind unter linux nur advisory locks möglich, wie das umstellen funktioniert, musst du mal recherchieren.
gruß andi
Mandatory Lock wird von kaum einem Unix unterstuetzt. Da gibt es z. B. Solaris,
bei welchem man ein Mandatory Lock erzeugen kann, indem man das Set Group ID Bit
setzt und das Group Execution Bit loescht. Aber auch das ist keine
Garantie dafuer, dass ein Mandatory Lock garantiert passiert, denn jeder andere
Prozess kann, wenn er dazu berechtigt ist, die entsprechenden Bits zuruecksetzen
und dann hast du wieder nur ein Advisory Lock.
Unter Linux kann man glaub ich das Dateisystem mit einer entsprechenden Option
mounten, damit die o. g. Bitmaske auch beachtet wird.
Hier noch etwas zu dem Thema:
http://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
gruss
v R
Also wie gesagt,ein paar Grundlagen sind ja da, nur leider hatte ich bisher nicht viel mit C++ gemacht, und wenn dann programmiere ich eigentlich auch nur nebenbei und das unter Java. Nur muss eben noch diese Entwurfarbeit abgeben...
Hab auch ein paar Stunden am Tag Zeit dafür, das heißt die nehme ich mir, nur würde halt gerne gezielt Wissen aufnehmen, deswegen auch meine Frage nach bestimmten Links etc..
leider hast du recht wenig hier von deinem code gepostet.
fd = open("TESTPIPE", O_WRONLY);
steht das vor dem fork? wenn ja und du verwendest fd in eltern- und kindprozess, dann kann keiner drauf schreiben, da der filedescriptor write only geöffnet wurde. probier mal O_RDWR. sollte das nicht helfen, poste bitte mehr von deinem programm.
in deinem code beispiel fehlt das ICU4U komplett.
willst du, dass die unicode escape sequence zur laufzeit oder zur compilierzeit erkannt wird? derzeit passiert das zur laufzeit vom gcc. die escape sequence is mehr oder weniger ein teil der sprache c++. du kannst das nicht teilen. das wäre so, als würdst du das if in i und f teilen. wenn du willst, dass die escape sequences zur laufzeit erkannt werden sollen, musst du diese im c++ code escapen:
const char* text = "bla\\u00E4bla";
wieso verwendest du diese ICU4U?
Hallo,
die 4k Daten würden für mich reichen.
Wie sieht es aber aus wenn Programm 1 die Datei zum lesen öffnet -> Taskwechsel und Programm 2 öffnet die Datei zum schreiben.
Taskwechsel zurück zum Programm 1. Was liest nun Programm 1.
Wichtig ist nicht ob neue oder alten Daten, sondern nur ob überhaupt "richtige" Werte/Daten gelesen werden.
Gruß
worst_case
Hallo,
falls Du immer noch auf der Suche bist,hier 2 Möglichkeiten:
1. http://www.linuxhilfe.org/softwaremanagement/
- hier findest Du Installationsquellen für OS_10.3,
die über Yast unter "Installationsquelle wechseln" eingebunden
werden können,z.B. über "URL angeben.."
- nach dem Einbinden noch kurz bearbeiten(Name der Quelle,evtl. Mirror)
- unter Editors: gibt es den bluefish
2. http://software.opensuse.org/search
- bluefish eingeben und auswählen!
DancingAntS :p
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ 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.
ich nehme an, dass das eien closed source datei ist. wenn dem nicht so ist, dann nimm den code einfach in deinen source code auf.
mit dem rest hast du recht. wenn du eine ganze exe in ein array verwandelt hast, musst du sie auf das dateisystem rausschreiben und dann ausführen. im ram ausführen klappt _wahrscheinlich_ nicht, da es ja eine exe ist, die im allgemeinen (von pie abgesehen) nicht relocatable ist. außerdem müsstest du den elf header parsern.
zum erstellen der datei solltest du mktemp verwenden. wohin du die datei dann schreibst, musst du auch überlegen. anbieten würden sich /dev/shm, /tmp, cwd oder der home ordner des users. ob du dateien in diesen ordnern erzeugen bzw. diese dann auch noch ausführen darfst, ist eine weitere frage. deshalb ist die ganze sache wohl eher nur für private projekte sinnvoll.
meines Wissens nach wartet
pthread_exit(NULL);
zum Beispiel bis alle Threads beendet sind...
Allerdings sollte man für diese Anwendung dann auch nicht
return 0;
in den Thread-Funktionen verwenden, sondern in allen Thread-Funktionen ebenfalls
pthread_exit(NULL);
Bei
pthread_join();
wird ebenfalls der Wert, welcher bei pthread_exit() angegeben wird als Rückgabewert herangezogen, da bringt ein return 0 eigentlich nix...
also aus deiner Funktion
void *ausgabe(void* wert)
{
cout << "Ausgabe vom Thread aus." << endl;
return 0;
}
wird
void *ausgabe(void* wert)
{
cout << "Ausgabe vom Thread aus." << endl;
pthread_exit(NULL);
}
Das sollte eigentlich das Problem aus der Welt schaffen
Vermutlich liegt es daran, dass du nur ein Element kopierst. Du müsstest aber jeden Pointer kopieren.
btw. den Rückgabewert von malloc zu casten ist pfui!