#include #include #include #include #include #include #include #include #include #include static void exit_with_errno (int err, const char *prefix) { if (err) { fprintf (stderr, "%s%s", prefix ? prefix : "", strerror(err)); exit (err); } } static pid_t spawn_process (const char *progname, const char **argv, const char **envp, int &err) { pid_t pid = 0; const posix_spawn_file_actions_t *file_actions = NULL; posix_spawnattr_t attr; err = posix_spawnattr_init (&attr); if (err) return pid; short flags = POSIX_SPAWN_SETEXEC | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK; err = posix_spawnattr_setflags (&attr, flags); if (err == 0) { // Use the default signal masks sigset_t no_signals; sigset_t all_signals; sigemptyset (&no_signals); sigfillset (&all_signals); posix_spawnattr_setsigmask(&attr, &no_signals); posix_spawnattr_setsigdefault(&attr, &all_signals); err = posix_spawn (&pid, progname, file_actions, &attr, (char * const *)argv, (char * const *)envp); posix_spawnattr_destroy(&attr); } return pid; } int main (int argc, char const **argv) { char *buf = (char*) malloc (strlen (argv[0]) + 12); strlcpy (buf, argv[0], strlen (argv[0]) + 1); std::string directory_name (::dirname (buf)); std::string other_program = directory_name + "/secondprog"; int err = 0; // Set breakpoint 1 here spawn_process (other_program.c_str(), argv, NULL, err); if (err) exit_with_errno (err, "posix_spawn x86_64 error"); return 0; }