Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung 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 bin zu blöd... habe da gerade mal was probiert und bekomme beim sendto() immer nur ein "Operation not supported". Der Code sieht ganz grob so aus:
id = socket(PF_UNIX, SOCK_STREAM, 0);
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, "/tmp/test.sock", sizeof("/tmp/test.sock"));
addrlen= sizeof(addr.sun_family)+strlen(addr.sun_path);
bind(id, (sockaddr*)addr, addrlen);
..
mb.sender = 99;
mb.port = 5000;
sendto(id, &mb, sizeof(mb), 0, (sockaddr*)addr, addrlen);
recvfrom(...);
So, und bei sendto() kommt jetzt immer als Rückgabewert ein EOPNOTSUPP (Operation not supported). Ich versteh nur nicht wieso.
Problem ist halt, ich bin Server und Client in einem Prozess. Eigentlich würde ich da noch ein listen() und ein accept() vor das sendto() packen, aber das accept() wartet ja auf einen Client.... ein Henne-Ei-Problem.
Oder übersehe ich da was?
Gruß
Thorsten
columbus schrieb:
Nachtrag: hier hat jemand die Antwort auf meinen ersten Beitrag rausgenommen! Dies ist kein Monolog
Sorry, habe meine Antwort versehentlich gelöscht.
Hi,
SEEK_END ist neben SEEK_CUR und SEEK_SET ja eine Position von wo aus der Offset für einen Zugriff berechnet wird. Normalerweise kenne ich es so, daß man dann negative Werte angeben muß, um relativ aufs Ende innerhalb der Datei zuzugreifen. Weil für alle Marker gilt SEEK_x + offset = neue Position.
Aber ist das so standardisiert? Bzw. wäre eine Implementation SEEK_END - offset = neue Position auch gültig oder kennt jemand derartige Implementationen, wo man eben positive Offsets angibt um innerhalb der Datei zu operieren?
danke
Hallo alle zusammen.
Ich hab ein kleines Problem beim Emfpangen von Daten via RS232 - oder vielleicht auch einen Denkfehler...
Folgendes will ich machen:
Ich habe einen Mikrochip (AVR) der Sendet via RS232 ständig Zeichen und danach 0x0A für NL und 0x0D für CR.
Wenn ich in Linux ein Terminal aufmache erhalte ich auch die Zahlen und Zeichen. Es sind eig. immer nur 2 Zeichen. Also z.b. 01 oder 05 oder 00
Ich habe mir folgendes aus dem Netz "geklaut" um Zeichen zu emfpangen, aber es funktioniert nicht richtig:
(MODEMDEVICE ist der String für den COM Port.
int fd;
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
// Wurde alles definiert...
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
// Ich glaube das sagt, dass er Zeile für Zeile liest...
newtio.c_lflag = ICANON;
// Keine Ahnung was das hier tut... kann mir das jemand erklären?
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
// Jetzt sollte irgendwas mit read kommen. Aber da bleibt er bei mir immer stehen... weiß also nicht weiter.
Kann mir jemand weiter helfen?
Das Gesendete sind nur Zahlen - von 0-20 allerdings in Textform. Ich brauch nichts weiter als eine Funktion die mir 1x die gerade anliegende Zahl von der RS232 Schnittstelle liest und zurückgibt. Irgendwie krieg ichs nicht hin.
Kann mir jemand helfen?
Gruß
Stomper
#ifdef __cplusplus
class Bla{
public:
int getFoo();
.
.
}
#endif
#ifdef __cplusplus
extern "C" {
#endif
[..]
int getFoo(...)
#ifdef __cplusplus /* C Zugriffe */
}
#endif
Wo sind da meine Fehler? Der Header soll von beiden Compilern gelesen werden können!
devkid schrieb:
An der Sache mit der Aufweck-Pipe stört mich aber noch etwas:
Damit müsste ich ja für jeden Client eine Pipe erstellen, womit das 2 zusätzliche File Deskriptoren pro Client wären. Ich glaube irgendwann stoß ich da noch an die Grenze der maximalen File Deskriptoren pro Prozess.
Du solltes ein select oder poll (oder epoll) für den gesamten Server haben, welcher alle Dateidescriptoren (oder Dateideskriptoren ) überwacht. Dann brauchst Du für diesen genau eine Aufweckpipe, um ihm zu signalisieren, dass er was tun soll.
Um die eigentliche Arbeit dennoch parallel von mehreren Threads zu verarbeiten, machst Du eine Queue, in die Du alle Dateidescriptoren steckst, auf denene es was zu tun gibt. Ein Poll von Threads wartet auf diese Queue und legt los, sobald es etwas zu tun gibt. Diese Queue wird über ein Event geweckt.
Alternativ kann der Thread, der das poll ausgeführt hat auch den nächsten Thread das poll übergeben und selbst die Arbeit erledigen. Das kann schneller sein, da der Descriptor, auf dem es was zu tun gibt, nicht erst an einen anderen Thread übergeben werden muss.
Klingt alles recht kompliziert und das ist es auch. Einen guten multithreaded Server zu schreiben ist durchaus anspruchsvoll.
Hi,
nun ja,
was passiert, wenn ich die Rechte im Programm wieder auf normalen User setze.
Läuft mein Debugger (Kdevelop) unter root-rechten. Wenn ja, danach immer noch.
Wie kann ich die Bits für den Debugger setzen, wenn ich direkt aus KDevelop den Prozess debuggen. Also die entsprechenden SUID Bit setzen.
Wie kann man die Owner Zuordnung auf "root" automatisiert setzen, ohne selber von der Group root zu sein ?
Gruss
bistn troll oder weisst du wirklich nicht warum man forkt ?
falls letzteres: man benutzt es wenn man einen neuen prozess starten will. wird z.b. gerne in serverapps gemacht. wenn man keinen neuen prozess starten will lässt man einfach die finger von fork
InfoStud84er schrieb:
Hallo,
ich verstehe irgendwie die execlp-Fkt nicht so richtig.
execlp("./prog","./prog",NULL);
So sieht mein Aufruf im Programm aus. Im aufzurufenden Programm steht ein simples printf. Das Problem ist das rein gar nichts passiert, also das in prog nicht reingegangen wird.
Schwer zu sagen, ohne Mehr Information über dein System zu haben. Es kann daran liegen, dass in deinem Working Directory keine ausführbare Datei "prog" existiert, oder dass du keine Rechte zur Ausführung hast,...
mach das
execlp("./prog","./prog",NULL);
perror("execlp");
wenn execlp einen Fehler erzeugt, dann wird perror dir 100% mehr Informationen liefern können.
Ah rüdiger auch noch wach
Ja klar, das geht.
Das Problem ist aber, wenn ich vom interface eth1 ein Request bekomme, dass das eben von interface eth1 ist und ich nach der IP-Adresse von interface eth1 nachschauen muss. Das ist das eignetliche Problem. Ich habe mehrere Netzwerkkarten also mehrere NICs. Und jedes NIC ist an einem anderen Netzwerk angeschlossen, hat also eine eigene IP-Adresse. Und wie bekomme ich heraus von welchem Interface ein Request kommt, damit ich mir die IP-Adresse von diesem Interface raussuchen kann.
ProgChild schrieb:
Evolu schrieb:
Kompiliere und setzt die Rechte dementsprechend:
-rws---r-x 1 root root
Das Sticky-Bit ist dafür verantwortlich das ich das mit root-rechten ausführe. Wie wir wissen funktioniert Sticky-Bit nur mit Binärdateien (um es mit Userrechten auszuführen). Das macht die Fehlermeldung um so komischer:
sh: line 1: /etc/init.d/dhcpd: Permission denied
...
Aber das Sticky-Bit funktioniert auch für Shell-Skripte. Deine Aussage ist diesbezüglich einfach falsch. Die Datei muss nur ausführbar sein. Aber Shell-Skripte mit root-Rechten sind sehr gefährlich.
verwechselt ihr da nicht Sticky-Bit mit setuid bit? setuid geht nämlich mit Skripten nicht (jedenfalls unter GNU/Linux)
Hallo Zusammen,
eins meiner Probleme habe ich gefunden.
Wenn ich den Benutzer verwende, mit welchem ich gerade unter Linux am arbeiten bin, dann funktioniert die Routine.
Nicht aber, wenn es ein anderer Benutzer. Dann kommt der Fehler
in retval
PAM_NEW_AUTHTOK_REQD
Bei einem erneuten setzen des Benutzer via
retval = pam_set_item(pamh,PAM_USER,userID);
retval = pam_set_item(pamh,PAM_AUTHTOK,upassword);
bekomme ich den Fehler 29 DOMAINE unbekannt.
Wenn ich dann mit
retval = pam_set_item(pamh,PAM_RHOST,(char*) "myhost");
ändert das an der Sache auch nichts.
Meine PAM.d/config sieht so aus
auth required pam_unix.so
account required pam_unix.so
Im Log steht dann auch nur:
pam_unix(bdo:auth): authentication failure; logname= uid=1000 euid=1000 tty= ruser= rhost=
Hat jemand eine Idee ?
Gruss