mirror of
https://github.com/tmux/tmux.git
synced 2026-03-06 07:45:35 +00:00
Add pane_pipe_pid with pipe fd and call setpgid to make it easier to kill.
This commit is contained in:
@@ -124,7 +124,7 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
/* Fork the child. */
|
/* Fork the child. */
|
||||||
sigfillset(&set);
|
sigfillset(&set);
|
||||||
sigprocmask(SIG_BLOCK, &set, &oldset);
|
sigprocmask(SIG_BLOCK, &set, &oldset);
|
||||||
switch (fork()) {
|
switch ((wp->pipe_pid = fork())) {
|
||||||
case -1:
|
case -1:
|
||||||
sigprocmask(SIG_SETMASK, &oldset, NULL);
|
sigprocmask(SIG_SETMASK, &oldset, NULL);
|
||||||
cmdq_error(item, "fork error: %s", strerror(errno));
|
cmdq_error(item, "fork error: %s", strerror(errno));
|
||||||
@@ -137,6 +137,9 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
sigprocmask(SIG_SETMASK, &oldset, NULL);
|
sigprocmask(SIG_SETMASK, &oldset, NULL);
|
||||||
close(pipe_fd[0]);
|
close(pipe_fd[0]);
|
||||||
|
|
||||||
|
if (setpgid(0, 0) == -1)
|
||||||
|
_exit(1);
|
||||||
|
|
||||||
null_fd = open(_PATH_DEVNULL, O_WRONLY);
|
null_fd = open(_PATH_DEVNULL, O_WRONLY);
|
||||||
if (out) {
|
if (out) {
|
||||||
if (dup2(pipe_fd[1], STDIN_FILENO) == -1)
|
if (dup2(pipe_fd[1], STDIN_FILENO) == -1)
|
||||||
|
|||||||
14
format.c
14
format.c
@@ -2225,6 +2225,17 @@ format_cb_pane_pipe(struct format_tree *ft)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Callback for pane_pipe_pid. */
|
||||||
|
static void *
|
||||||
|
format_cb_pane_pipe_pid(struct format_tree *ft)
|
||||||
|
{
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
if (ft->wp != NULL && ft->wp->pipe_fd != -1)
|
||||||
|
xasprintf(&value, "%ld", (long)ft->wp->pipe_pid);
|
||||||
|
return (value);
|
||||||
|
}
|
||||||
|
|
||||||
/* Callback for pane_right. */
|
/* Callback for pane_right. */
|
||||||
static void *
|
static void *
|
||||||
format_cb_pane_right(struct format_tree *ft)
|
format_cb_pane_right(struct format_tree *ft)
|
||||||
@@ -3311,6 +3322,9 @@ static const struct format_table_entry format_table[] = {
|
|||||||
{ "pane_pipe", FORMAT_TABLE_STRING,
|
{ "pane_pipe", FORMAT_TABLE_STRING,
|
||||||
format_cb_pane_pipe
|
format_cb_pane_pipe
|
||||||
},
|
},
|
||||||
|
{ "pane_pipe_pid", FORMAT_TABLE_STRING,
|
||||||
|
format_cb_pane_pipe_pid
|
||||||
|
},
|
||||||
{ "pane_right", FORMAT_TABLE_STRING,
|
{ "pane_right", FORMAT_TABLE_STRING,
|
||||||
format_cb_pane_right
|
format_cb_pane_right
|
||||||
},
|
},
|
||||||
|
|||||||
1
tmux.1
1
tmux.1
@@ -6323,6 +6323,7 @@ The following variables are available, where appropriate:
|
|||||||
.It Li "pane_path" Ta "" Ta "Path of pane (can be set by application)"
|
.It Li "pane_path" Ta "" Ta "Path of pane (can be set by application)"
|
||||||
.It Li "pane_pid" Ta "" Ta "PID of first process in pane"
|
.It Li "pane_pid" Ta "" Ta "PID of first process in pane"
|
||||||
.It Li "pane_pipe" Ta "" Ta "1 if pane is being piped"
|
.It Li "pane_pipe" Ta "" Ta "1 if pane is being piped"
|
||||||
|
.It Li "pane_pipe_pid" Ta "" Ta "PID of pipe process, if any"
|
||||||
.It Li "pane_right" Ta "" Ta "Right of pane"
|
.It Li "pane_right" Ta "" Ta "Right of pane"
|
||||||
.It Li "pane_search_string" Ta "" Ta "Last search string in copy mode"
|
.It Li "pane_search_string" Ta "" Ta "Last search string in copy mode"
|
||||||
.It Li "pane_start_command" Ta "" Ta "Command pane started with"
|
.It Li "pane_start_command" Ta "" Ta "Command pane started with"
|
||||||
|
|||||||
1
tmux.h
1
tmux.h
@@ -1213,6 +1213,7 @@ struct window_pane {
|
|||||||
enum client_theme last_theme;
|
enum client_theme last_theme;
|
||||||
|
|
||||||
int pipe_fd;
|
int pipe_fd;
|
||||||
|
pid_t pipe_pid;
|
||||||
struct bufferevent *pipe_event;
|
struct bufferevent *pipe_event;
|
||||||
struct window_pane_offset pipe_offset;
|
struct window_pane_offset pipe_offset;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user