Johannes schrieb:
> bis auf die Zeile char *ifname = "vcan0"; sehen diese alle gleich aus.
Für sowas hat pthread_create hinten das "void *arg" wenn die Threads
identisch sind, dann schreibe den Code einmal und denke dir eine schöne
Struktur aus um die Unterschiede per Parameter zu übergeben.
Johannes schrieb:
> jetzt erstelle ich im Terminal vcan0 bis vcan4
> Wenn ich jetzt eine Nachricht schicke, kommt diese auch im
> Interrupthandler an. Allerdings in allen.
Glückwunsch 50% Erfolg, aber mal ernsthaft, hast du den Return des ioctl
mal überprüft?
1 | ioctl(s, SIOCGIFINDEX, &ifr);
|
Wenn der schiefgeht ist, der Rest des Threads undefiniert, was zu dein
beschrieben verhalten führen kann.
1 | strcpy(ifr.ifr_name, ifname );
|
das ist sicher ein Security-Issue, die, wenn ifname hinreichend lang
ist gibt es ein Bufferoverflow, wie viele Bytes verträgt denn
ifr.ifr_name?
der Teil ist Toter Code und kann nicht erreicht werden, da es nur ein
return 1 die while(1) Schleife verlassen kann!
1 | printf("\r\n");
|
2 |
|
3 | if (close(s) < 0) {
|
4 | perror("Close");
|
5 | return 1;
|
6 | }
|
7 |
|
8 | return 0;
|
deine Funktionssignatur ist:
1 | void * pVCan1Rx(__attribute__((unused)) void * pData);
|
Du gibst aber Int werte zurück, diese werden implizit auf Pointer
gecastet, ein Pointer auf die Adresse 1 (return 1) ist aber Käse und
führt im besten fall nur zu einem Coredump wenn jemand den Return wert
weiter verwendet. Deine Fehlerbehandlung durch die Return Values ist
daher komplett für die Tonne und sollte dringend überarbeitet werden.
Johannes schrieb:
> Wo kann/muss ich es genau einstellen, dass Nachrichten von vcan0 nur in
> pVCan1Rx ankmomen?
Es war schwer denn Code zu schreiben, also muss es schwer sein Ihn zu
lesen!
Das ist für 3. eine fiese Falle, wenn du wirklich für jeden can eine
eigene Funktion implementierst muss die für vcan0 auch pVCan0Rx heißen.
C ist zerobased und alles andere sorgt nur für Verwirrung und bei
hinreichend Komplexen Programmen dafür das die Programmierer falsche
annahmen machen.
und Zuletzt, wenn du das Gefühl hast nach jeden Printf stdout zu
flushen, solltest du Nachdenke ob printf dein Freund ist und/oder du mit
tcsetattr() das Terminal nicht vielleicht besser auf unbufferd umstellen
willst.