extern char* argv0; static char* getcwd_by_pid(pid_t pid) { static char cwd[32]; snprintf(cwd, sizeof cwd, "/proc/%d/cwd", pid); return cwd; } void newterm(const Arg* a) { switch (fork()) { case -1: die("fork failed: %s\n", strerror(errno)); break; case 0: switch (fork()) { case -1: die("fork failed: %s\n", strerror(errno)); break; case 0: chdir(getcwd_by_pid(pid)); execl("/proc/self/exe", argv0, NULL); exit(1); default: exit(0); } } }