Hallo,
mit sigpending() kann man ja die Menge der blockierten Signale erfragen und mit sigismember() ob ein bestimmtes Signal in dieser Signalmenge ist.
Wie kann ich mir anzeigen lassen wie oft ein bestimmtes Signal blockiert ist, bzw. wie viele Signale auf ihre Zustellung warten?
Danke.
O.G.Wrapper schrieb:
Linux Programmer Guide Da sollte alles drin stehen.
Hallo,
leider fuerht der Link bei mir zu nichts.
Danke fuer die Tipps, ich habe nun auch zwei Seiten entdeckt:
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
https://computing.llnl.gov/tutorials/pthreads/
Ich werde mal sehen, welche fuer mich die brauchbarste ist.
Es ist nicht vernünfig:
1. Die Funktion, die an pthread_create übergeben wird, darf nicht statische Funktion einer Klasse sein. Sie muss eine freistehende extern "C" Funktion sein.
2. Der Zugriff auf running ist nicht synchronisiert. Keiner garantiert, dass der Thread jemals die Veränderung mitkriegt.
hi
danke für deine antwort, macht natürlich sinn deine argumentation, frage ist nur wie ich das lösen soll. gibt es eine äquivalente funktion zu fgets die nicht blockiert? oder was wäre eine vernünftige lösung in dem fall?
ich hab noch eine andere lösung geschrieben wo der error stream nicht gesondert behandelt wird und dort funktionierts wunderbar
string CProcess::executeProcessNoErrorPiping (string cmd, bool stopOnReturnErrorCode)
/*
* This method uses popen and pclose to receive a stream of text from a system process. Error stream and std out stream are not handeled seperatly.
* params:
* cmd: command to execute
* stopOnReturnErrorCode: if your command has a return code which is not 0, the LOGGER is called with param ERROR
* return: the messages recived from the started process
*/
{
char psBuffer[128];
FILE *pPipe;
string returnMsg;
string logMsg;
int returnCode;
if((pPipe = popen(cmd.c_str(), "r")) == NULL)
{
char errorBuff [256];
sprintf(errorBuff, "could not execute command '%s'.\n", cmd.c_str());
LOGGER.log("CProcess::executeProcess", errorBuff, ERROR);
} else {
/* Read pipe until end of file. */
while(!feof(pPipe))
{
if(fgets(psBuffer, 128, pPipe) != NULL)
// printf(psBuffer);
returnMsg = returnMsg + psBuffer;
}
/* Close pipe and print return value of pPipe. */
returnCode = pclose(pPipe);
if (returnMsg[returnMsg.length()-1] == '\n') { // avoid the linebreak in the logger
returnMsg[returnMsg.length()-1] = ' ';
}
stringstream ss;
ss << returnCode;
string returnCodeString (ss.str());
logMsg = "the command \"" + cmd + "\" returns the message :\"" + returnMsg + "\" and returnCode is: " + returnCodeString + "";
LOGGER.log("CProcess::executeProcess", logMsg + "", DEBUG2);
if (stopOnReturnErrorCode && returnCode!=0) { // check if the return code is something different form 0
LOGGER.log("CProcess::executeProcess", "your last command returned an error code", ERROR);
}
}
return returnMsg;
}
frage ist nur wie kombinier ich die beiden, dass der error stream gesondert behandelt wird und große dateinmengen angenommen werden dürfen? (für ls ist es kein problem wenn ich den error stream nicht gesondert habe, aber bei anderen komplexeren programmen sehr wohl)
lg
lordy
Hi,
mit sigpending() und sigismember() kann man erfragen ob ein bestimmtes Signal in der Queue ist, aber wie bekommt man raus wie oft dieses Signal dort vorhanden ist?
Danke.
firefly schrieb:
hä libxxx.a sind statiche libs. Ich habe noch nie einen symlink namens libxxx.a gesehen der auf libxxx.so zeigt.
Hm... hast recht. Hab mich geirrt. Unter Windows generiert mir der GCC beim erstellen von DLLs .a-Dateien, die in Wirklichkeit mit der DLL linken, aber das liegt wohl an der unterschiedlichen Arbeitsweise vom ELF und dem PE-Format.
@Thread Ersteller: Versuch mal das Argument -static beim Aufruf vom GCC, wenn du deine Dateien linkst.
Wenn du andernfalls erzwingen willst, dass nur die statischen Biliotheken genommen werden, kannst du einfach symlinks von nur den statischen Biliotheken machen und nur diesen Order in den Biliothekssuchpfad eintragen. Das wäre aber ein Workaround.
Also das heisst, der Kern ist nur dafür Zuständig, das der Computer läuft, während in einem Betriebssystem noch Software wie eine Shell dabei ist, um den Kern anzusteuern, der dann die Hardware ansteuert? (Könnte jetzt kreuzfalsch sein was ich da rauslasse, aber ich habe es versucht. )
rs232-freak schrieb:
wenn ich mich recht entsinne, darf ein 'break'-signal nicht zu kurz sein, um als solches erkannt zu werden. länger aber schon.
Das ist hier nicht wirklich relevant, aber 20ms ist einfach Zeitverschwendung.
Danke für die Antwort, aber hat leider auch nicht funktioniert. Hab folgendes gemacht:
export LD_LIBRARY_PATH="/tmp/src/"
export LD_PRELOAD="/tmp/src/libsqlite3.so.0.8.6"
Aber ohne Erfolg, immer noch gleiche Fehlermeldung:
"/tmp/olsrd_supernodes.so.0.2: undefined symbol: sqlite3_open_v2"
Ansonsten installier doch einfach sqlite auf dem anderen Rechner. Bei Ubuntu geht das doch einfach mittels sudo apt-get install sqlite3 (per Hand sollte man nur etwas kompilieren, wenn es kein passendes Paket dafür gibt).
Hab keine Rechte dazu, aber werd den admin bitten, es für mich zu installieren, wenn keiner weiß, wie es anders geht...