Meine Frage ist ziemlich einfach. Unter Linux ist es sehr beliebt, fork ohne exec
zu verwendenIch habe jedoch festgestellt, dass dies auf MacOS nicht möglich ist (siehe Handbuch Gabel)
Es gibt Grenzen dafür, was Sie im Child-Prozess tun können. Um absolut sicher zu sein, solltest du dich selbst einschränken Selbst, um nur Async-Signal-sichere Operationen auszuführen, bis eine der exec-Funktionen ist namens. Es sollte davon ausgegangen werden, dass alle APIs einschließlich globaler Datensymbole in einem Framework oder einer Bibliothek verwendet werden unsicher nach einem fork (), sofern nicht ausdrücklich als sicher oder async-signalsicher dokumentiert. Wenn Sie verwenden müssen Diese Frameworks im untergeordneten Prozess müssen Sie ausführen. In dieser Situation ist es sinnvoll, sich selbst zu exekutieren.
Das erscheint mir seltsam? Was ist der Grund? Ist es möglich, es zu umgehen?
Es ist in Ordnung, fork in OS X zu verwenden, unter den gleichen Einschränkungen, die Sie fork mit Linux verwenden würden. Linux hat ähnliche Vorbehalte .
Wenn Sie eine Anwendung erstellen, die single-threaded ist und auf den grundlegenden UNIX-APIs und der Designphilosophie beruht, sollten Sie in Ordnung sein. Wenn Sie mit zusätzlichen Bibliotheken verknüpfen, sollten Sie mit ihrem Verhalten vertraut sein. Stellen Sie sich vor, Sie würden zu einer Bibliothek verlinken, die einen Hintergrund-Thread gestartet hat - nach der Verzweigung befinden Sie sich in einem möglicherweise nicht definierten Zustand, da nur der Thread namens fork geklont wird.
OS X bietet einige tolle Funktionen, um mehrere Kerne zu nutzen, wie z. B. Grand Central Dispatch , die eine Überlegung wert sind .
Ich würde Ihnen empfehlen, diesen Artikel von Mike Ash zu lesen auf Gabel Sicherheit unter OS X.