66 char thread_name[16] = {0};
67#ifdef HAVE_PTHREAD_GETNAME_NP
68 pthread_getname_np(pthread_self(), thread_name,
sizeof(thread_name));
71 std::ostringstream buffer;
72 buffer << (exe_name ? exe_name :
"") <<
"-" << getpid() <<
"/";
74 if (thread_name[0] !=
'\0') {
75 buffer << thread_name <<
"-";
81 buffer << syscall(SYS_gettid);
82#elif defined(HAVE_PTHREAD_THREADID_NP)
84 pthread_threadid_np(
nullptr, &tid);
86#elif defined(HAVE_PTHREAD_GETTHREADID_NP)
87 buffer << pthread_getthreadid_np();
89 buffer << std::this_thread::get_id();
92 return std::move(buffer).str();
122 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) != 0) {
123 throw std::system_error(errno, std::system_category(),
"socketpair");
132 const std::vector<std::string>
args{fd_to_args(fds[0])};
133 const std::vector<char*> argv{MakeArgv(
args)};
137 throw std::system_error(errno, std::system_category(),
"fork");
142 if (close(fds[pid ? 0 : 1]) != 0) {
145 throw std::system_error(errno, std::system_category(),
"close");
147 static constexpr char msg[] =
"SpawnProcess(child): close(fds[1]) failed\n";
148 const ssize_t writeResult = ::write(STDERR_FILENO, msg,
sizeof(msg) - 1);
156 const int maxFd = MaxFd();
157 for (
int fd = 3; fd < maxFd; ++fd) {
163 execvp(argv[0], argv.data());
168 perror(
"execvp failed");