Track pid of child process from exec

This will allow us to eventually open that process on the current view.
Requires support from @Cloudef.
This commit is contained in:
Drew DeVault 2015-11-16 19:40:44 -05:00
parent 6850174049
commit 01202568f9

View file

@ -214,22 +214,37 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) {
free(tmp); free(tmp);
sway_log(L_DEBUG, "Executing %s", cmd); sway_log(L_DEBUG, "Executing %s", cmd);
int fd[2];
pipe(fd);
pid_t pid; pid_t pid;
pid_t *child = malloc(sizeof(pid_t)); // malloc'd so that Linux can avoid copying the process space
// Fork process // Fork process
if ((pid = fork()) == 0) { if ((pid = fork()) == 0) {
// Fork child process again // Fork child process again
setsid(); setsid();
if (fork() == 0) { if ((*child = fork()) == 0) {
execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL); execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL);
/* Not reached */ /* Not reached */
} }
// Close child process close(fd[0]);
_exit(0); write(fd[1], child, sizeof(pid_t));
close(fd[1]);
_exit(0); // Close child process
} else if (pid < 0) { } else if (pid < 0) {
return cmd_results_new(CMD_FAILURE, "exec_always", "Command failed (sway could not fork)."); return cmd_results_new(CMD_FAILURE, "exec_always", "Command failed (sway could not fork).");
} }
close(fd[1]); // close write
read(fd[0], child, sizeof(pid_t));
close(fd[0]);
// cleanup child process // cleanup child process
wait(0); wait(0);
if (*child > 0) {
sway_log(L_DEBUG, "Child process created with pid %d", *child);
// TODO: keep track of this pid and open the corresponding view on the current workspace
// blocked pending feature in wlc
}
free(child);
return cmd_results_new(CMD_SUCCESS, NULL, NULL); return cmd_results_new(CMD_SUCCESS, NULL, NULL);
} }