In Linux entstehen neue Prozesse immer und nur durch fork(). https://de.wikipedia.org/wiki/Fork_%28Unix%29 ( Ausnahme nur unmittelbar beim Systemstart, da gibts noch was anderes)
Das Bedeutet, wenn irgend ein Prozess/Programm/..... gestartet wird, dann wird dabei zuerst die komplette ProzessUmgebung des aktuellen Prozesses im Speicher dupliziert und dann in der duplizierten Umgebung der auszuführende Programmcode für das zu startende Programm da hinein geladen und dieses dann gestartet. Das aktuelle Programm ist dabei der sogenannte Vaterprozess, der dabei neu entstehende Prozess der Sohn-Prozess. Ein Neuer Prozess kann also immer nur dadurch entstehen, indem der aufrufende Prozess im Hauptspeicher geclont wird, und dieser Clone im Speicher dann zum Starten des entsprechenden Programmcodes genutzt wird.
Es werden dabei auch immer Eigenschaften von Vater auf den Sohn vererbt, zB die User uÄ, Zugriffsrechte, Prozessresourcen, globale Einstellungen, exportierten Variablen, und vieles mehr.
der Vaterprozess bekommt beim forking auch die PID vom Sohnprozess mitgeteilt und speichert diese auch in einer Tabelle und kennt praktisch zu jedem Zeitpunkt den aktuellen Ausführungsstatus (running, gestoppt, gekillt....) all seiner Söhne.
Bedeutet, jedes Programm hat dadurch genau einen einzigen Vater, und wenn der Sohnprozess stirbt oder normal endet, meldet er sich beim Vaterprozess ab und gibt dabei auch seinen Returnwert dort ab.
Stribt oder endet der Vaterprozess vorher, dann wird dabei an alle seine noch laufenden Sohnprozesse ein Signal (SIGHUP) gesendet, das all seine Sohnprozesse im Normalfall auch alle beendet wenn der Vaterprozess sich beendet.
Es gibt aber Möglichkeiten dem Sohn dazu zu bewegen, dieses Signal zu ignorieren, ein solcher Prozess würde dann aber ohne Vater weiterlaufen, das ist nicht erlaubt, und deshalb wird dieser Prozess dann beim vorzeitigen Tot des Vaters von Prozess mit der PID 1 (systemd) adoptiert und dieser ist dann der neue Vaterprozess dieses Sohnprozesses, mit all seinen Rechten und Pflichten.
Damit ist es gar nicht möglich, das irgendein Prozess einen Rückgabewert an irgend ein anderen als an seinen Vaterprozess senden kann. Das sollte deine Frage prinzipiell erstmal beantworten.
Besteht aber noch die Frage, was ist wenn ein Vater jetzt viele viele ähnliche Sohnprozesse hat und wie er jetzt erkennt welcher Sohn jetzt welchen Returnwert geliefert hat.
Dieses ist in der Tat nicht ganz so einfach und konfortabel in der Shell zu programmieren, aber es ist möglich das der Vaterprozess auch all seine Sohnprozesse in der Form überwacht, dass er auf deren Beenden wartet und dort können dann auch die Returnwerte zu den beendeten Sohnprozessen ermittelt, ausgewertet oder ausgegeben werden. Siehe dazu zB. die Manpage von wait(1p) , jobs(1), bash(1)
robi