CE implement running commands in background
This commit is contained in:
42
ce/interp.c
42
ce/interp.c
@@ -370,7 +370,7 @@ static void cmd_write_proc (void* arg) {
|
||||
}
|
||||
}
|
||||
|
||||
static void execute_cmd (struct ast_cmd* cmd, struct context* context) {
|
||||
static void execute_cmd (struct ast_cmd* cmd, struct context* context, bool run_bg) {
|
||||
if (strcmp (cmd->name, "echo") == 0) {
|
||||
echo (context, cmd->args, cmd->arg_count);
|
||||
} else if (strcmp (cmd->name, "help") == 0) {
|
||||
@@ -444,18 +444,25 @@ static void execute_cmd (struct ast_cmd* cmd, struct context* context) {
|
||||
i++;
|
||||
}
|
||||
|
||||
struct cmd_write_proc_ctx wpctx = {.pgid = pgid, .cancel_pid = pid};
|
||||
if (run_bg) {
|
||||
exec_partial_fini (pid);
|
||||
|
||||
struct process_data* write_pdata = process_spawn (&cmd_write_proc, (void*)&wpctx);
|
||||
struct process_data* collect_pdata = process_spawn (&cmd_collect_proc, (void*)(uintptr_t)pgid);
|
||||
cprintf (context, "started background process: PID %d\n", pid);
|
||||
} else {
|
||||
struct cmd_write_proc_ctx wpctx = {.pgid = pgid, .cancel_pid = pid};
|
||||
|
||||
exec_partial_fini (pid);
|
||||
wait_for_pid (pid);
|
||||
struct process_data* write_pdata = process_spawn (&cmd_write_proc, (void*)&wpctx);
|
||||
struct process_data* collect_pdata =
|
||||
process_spawn (&cmd_collect_proc, (void*)(uintptr_t)pgid);
|
||||
|
||||
kill (write_pdata->pid);
|
||||
process_data_free (write_pdata);
|
||||
kill (collect_pdata->pid);
|
||||
process_data_free (collect_pdata);
|
||||
exec_partial_fini (pid);
|
||||
wait_for_pid (pid);
|
||||
|
||||
kill (write_pdata->pid);
|
||||
process_data_free (write_pdata);
|
||||
kill (collect_pdata->pid);
|
||||
process_data_free (collect_pdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,24 +514,27 @@ static void execute_redir (struct ast_redir* redir, struct context* context) {
|
||||
filewriter_fini (&fw);
|
||||
}
|
||||
|
||||
void execute (struct ast_node* root, struct context* context) {
|
||||
void execute (struct ast_node* root, struct context* context, bool run_bg) {
|
||||
struct context subcontext;
|
||||
memset (&subcontext, 0, sizeof (subcontext));
|
||||
|
||||
switch (root->class) {
|
||||
case AST_NODE_CLASS_CMD:
|
||||
execute_cmd (&root->u.cmd, context);
|
||||
execute_cmd (&root->u.cmd, context, run_bg);
|
||||
break;
|
||||
case AST_NODE_CLASS_SUBSHELL:
|
||||
execute (root->u.subshell.inner, &subcontext);
|
||||
execute (root->u.subshell.inner, &subcontext, run_bg);
|
||||
break;
|
||||
case AST_NODE_CLASS_SEQ:
|
||||
execute (root->u.seq.left, context);
|
||||
execute (root->u.seq.right, context);
|
||||
execute (root->u.seq.left, context, run_bg);
|
||||
execute (root->u.seq.right, context, run_bg);
|
||||
break;
|
||||
case AST_NODE_CLASS_REDIR:
|
||||
execute (root->u.redir.source, &subcontext);
|
||||
execute (root->u.redir.source, &subcontext, run_bg);
|
||||
execute_redir (&root->u.redir, &subcontext);
|
||||
break;
|
||||
case AST_NODE_CLASS_RUN_BG:
|
||||
execute (root->u.run_bg.expr, context, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user