CE implement running commands in background
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 3m15s
Build documentation / build-and-deploy (push) Successful in 2m53s

This commit is contained in:
2026-03-29 19:55:24 +02:00
parent 482afb47d7
commit dc556d1524
4 changed files with 52 additions and 19 deletions

View File

@@ -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;
}
}