open("/dev/ttyS0", O_RDWR);
-
Hallo,
ich habe Probleme beim Öffnen von ttyS0 aus einem Modul.heraus. Bei Programmen funktioniert es einwandfrei. Aber in einem libtool-Modul (.so) liefert die Funktion open() immer -1.So wird das Modul geladen (mit libtool-- von C. Holm):
using namespace ltmm; typedef function0<ControlFactory*> controlfactory_init; try { //std::map<std::string,symbol_list>& preloaded = loader<>::preloaded(); loader<>& l = loader<>::instance(); l.addto_search_path("/mnt/multiview/3dtv/source/modules/debug/src/"); handle<>&myhandle = l.load("libcontrol.so"); controlfactory_init myinit(myhandle.find_symbol("myfactory_init")); ControlFactory* myfactory = myinit(); control = myfactory->create(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } control->send(autowhite);
Und so sieht es in dem Modul aus.
void Control::senden(int a) { stream = open("/dev/ttyS0", O_WRONLY); if ( stream == -1 ) { cout << "could not open"<<endl; exit (-1); } n = write( stream, &a, 1); close( stream ); } void Control::send(int command) { switch(command) { case autowhite: senden(2); break; } }
-
Nur so eine Idee: Vielleicht musst du die open()-Option O_NOCTTY setzen, wenn du die Funktion aus einer Library heraus aufrufst, damit die Terminal-Schnittstelle nicht als "Controlling terminal" eingerichtet wird.
Siehe auch open (2)Martin
-
ich habe mir mal die Fehlernummer von open() ausgeben lassen (errno).
Es ist 16. Wenn mich nicht alles täuscht, bedeutet das: ENFILE - The limit on the total number of files open on the system has been reached.Wie kann das möglich sein? Alle anderen Programme können ja auch noch munter Dateien und devices öffnen...
Und wie gesagt. aus einem dtatisch verlinkten Programm geht es.
-
ich habe mir mal die Fehlernummer von open() ausgeben lassen (errno).
Es ist 16. Wenn mich nicht alles täuscht, bedeutet das: ENFILE - The limit on the total number of files open on the system has been reached.Mit man: perror(3) (Schreibt auf stderr) bzw man: strerror(3) (Liefert einen String) erhälst du die Fehlermeldung in einem Klartext.
Wie kann das möglich sein? Alle anderen Programme können ja auch noch munter Dateien und devices öffnen...
Das File Limit gilt ja auch nur für einzelne Prozesse und nicht für das gesamt System.
-
ich hatte mich verzählt. das open() liefert: Device or resource busy.
Gibt es da einen Zusammenhang zum Aufruf aus einer shared library?