diff --git a/modules/juce_core/native/juce_linux_Files.cpp b/modules/juce_core/native/juce_linux_Files.cpp index f661e4ab4..dce73fcc2 100644 --- a/modules/juce_core/native/juce_linux_Files.cpp +++ b/modules/juce_core/native/juce_linux_Files.cpp @@ -223,15 +223,21 @@ bool Process::openDocument (const String& fileName, const String& parameters) const char* const argv[] = { "/bin/sh", "-c", cmdString.toUTF8(), nullptr }; +#if JUCE_USE_VFORK + const auto cpid = vfork(); +#else const auto cpid = fork(); +#endif if (cpid == 0) { +#if ! JUCE_USE_VFORK setsid(); +#endif // Child process - execve (argv[0], (char**) argv, environ); - exit (0); + if (execve (argv[0], (char**) argv, environ) < 0) + _exit (0); } return cpid >= 0; diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm index aefa76317..066c12cde 100644 --- a/modules/juce_core/native/juce_mac_Files.mm +++ b/modules/juce_core/native/juce_mac_Files.mm @@ -92,23 +92,22 @@ namespace MacFileHelpers #else static bool launchExecutable (const String& pathAndArguments) { + const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr }; + +#if JUCE_USE_VFORK + const auto cpid = vfork(); +#else auto cpid = fork(); +#endif if (cpid == 0) { - const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), nullptr }; - // Child process - if (execve (argv[0], (char**) argv, nullptr) < 0) - exit (0); - } - else - { - if (cpid < 0) - return false; + if (execvp (argv[0], (char**) argv) < 0) + _exit (0); } - return true; + return cpid >= 0; } #endif } diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index f3a8f061b..bcd3eab59 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -1125,7 +1125,18 @@ public: if (pipe (pipeHandles) == 0) { - auto result = fork(); + Array argv; + for (auto& arg : arguments) + if (arg.isNotEmpty()) + argv.add (const_cast (arg.toRawUTF8())); + + argv.add (nullptr); + +#if JUCE_USE_VFORK + const pid_t result = vfork(); +#else + const pid_t result = fork(); +#endif if (result < 0) { @@ -1134,6 +1145,7 @@ public: } else if (result == 0) { +#if ! JUCE_USE_VFORK // we're the child process.. close (pipeHandles[0]); // close the read handle @@ -1148,17 +1160,10 @@ public: dup2 (open ("/dev/null", O_WRONLY), STDERR_FILENO); close (pipeHandles[1]); +#endif - Array argv; - - for (auto& arg : arguments) - if (arg.isNotEmpty()) - argv.add (const_cast (arg.toRawUTF8())); - - argv.add (nullptr); - - execvp (exe.toRawUTF8(), argv.getRawDataPointer()); - _exit (-1); + if (execvp (exe.toRawUTF8(), argv.getRawDataPointer()) < 0) + _exit (-1); } else {