opt: cmd spawn fail not trigger coredump generate

This commit is contained in:
DreamMaoMao 2025-05-16 15:52:24 +08:00
parent 51807e3c1b
commit f5ad0f263b

View file

@ -6127,28 +6127,35 @@ void setup(void) {
void spawn(const Arg *arg) { void spawn(const Arg *arg) {
if (fork() == 0) { if (fork() == 0) {
// 1. 忽略可能导致 coredump 的信号
signal(SIGSEGV, SIG_IGN);
signal(SIGABRT, SIG_IGN);
signal(SIGILL, SIG_IGN);
dup2(STDERR_FILENO, STDOUT_FILENO); dup2(STDERR_FILENO, STDOUT_FILENO);
setsid(); setsid();
// 将 arg->v 拆分为字符串数组 // 2. 解析参数
char *argv[64]; // 假设最多有 64 个参数 char *argv[64];
int argc = 0; int argc = 0;
char *token = strtok((char *)arg->v, " "); char *token = strtok((char *)arg->v, " ");
while (token != NULL && argc < 63) { while (token != NULL && argc < 63) {
// 扩展 ~ 为家目录路径
wordexp_t p; wordexp_t p;
if (wordexp(token, &p, 0) == 0) { if (wordexp(token, &p, 0) == 0) {
argv[argc++] = p.we_wordv[0]; argv[argc++] = p.we_wordv[0];
} else { } else {
argv[argc++] = token; // 如果扩展失败,使用原始 token argv[argc++] = token;
} }
token = strtok(NULL, " "); token = strtok(NULL, " ");
} }
argv[argc] = NULL; // execvp 需要以 NULL 结尾的数组 argv[argc] = NULL;
// 执行命令 // 3. 执行命令
execvp(argv[0], argv); execvp(argv[0], argv);
die("dwl: execvp %s failed:", argv[0]);
// 4. execvp 失败时:打印错误并直接退出(避免 coredump
wlr_log(WLR_ERROR, "dwl: execvp '%s' failed: %s\n", argv[0], strerror(errno));
_exit(EXIT_FAILURE); // 使用 _exit 避免缓冲区刷新等操作
} }
} }