Du hast's immer noch nicht begriffen: Dinge wie fork() gehören zur
recht komplexen Multitasking-Umgebung eines unixoiden Betriebssystems.
Sowas hat auf einem 8-bit-AVR keinen Sinn. (Auf einem AVR32 AP7000
sieht die Sache natürlich ganz anders aus.)
Es gibt zwei gängige Wege dafür, eine derartige Simultanität zu
erreichen. Entweder suchst du dir eins der bestehenden sogenannten
Echtzeitkerne oder Echtzeitbetriebssyteme (real-time operating
system, RTOS) aus und schaust, ob das deinen Anforderungen gerecht
wird. Diese sind beim AVR aber in der Regel auf Kleinheit getrimmt,
also das Äquivalent zu fork() wirst du dort so nicht finden, sondern
deren Programmierung ist komplett anders als bei einem unixoiden
Betriebssystem. In aller Regel machen diese auch kooperatives
Multitasking, d. h. ein Prozess muss die Steuerung freiwillig
abtreten, sowie er ein Stück seiner Arbeit erledigt hat.
Die zweite Variante ist, dass man das Ganze mittels Interrupts und
einer eigenen Verwaltung (bspw. einer state machine) selbst ,,zu
Fuß'' implementiert. Sowohl die UART als auch der CAN-Bus-Controller
können ja einen Interrupt generieren, sowie bei ihnen Daten
eingetroffen sind. Die Hauptschleife wartet einfach, bis irgendwas
passiert (solange gar nichts zu tun ist, kann die CPU dabei im idle
sleep warten und Strom sparen), und sowie an einer der beiden
Quellen Daten angekommen sind, werden diese verarbeitet. Anschließend
wird wieder auf ein Ereignis gewartet.