mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2025-11-01 22:58:44 -04:00
opt: cmd spawn fail not trigger coredump generate
This commit is contained in:
parent
51807e3c1b
commit
f5ad0f263b
1 changed files with 14 additions and 7 deletions
21
src/maomao.c
21
src/maomao.c
|
|
@ -6127,28 +6127,35 @@ void setup(void) {
|
|||
|
||||
void spawn(const Arg *arg) {
|
||||
if (fork() == 0) {
|
||||
// 1. 忽略可能导致 coredump 的信号
|
||||
signal(SIGSEGV, SIG_IGN);
|
||||
signal(SIGABRT, SIG_IGN);
|
||||
signal(SIGILL, SIG_IGN);
|
||||
|
||||
dup2(STDERR_FILENO, STDOUT_FILENO);
|
||||
setsid();
|
||||
|
||||
// 将 arg->v 拆分为字符串数组
|
||||
char *argv[64]; // 假设最多有 64 个参数
|
||||
// 2. 解析参数
|
||||
char *argv[64];
|
||||
int argc = 0;
|
||||
char *token = strtok((char *)arg->v, " ");
|
||||
while (token != NULL && argc < 63) {
|
||||
// 扩展 ~ 为家目录路径
|
||||
wordexp_t p;
|
||||
if (wordexp(token, &p, 0) == 0) {
|
||||
argv[argc++] = p.we_wordv[0];
|
||||
} else {
|
||||
argv[argc++] = token; // 如果扩展失败,使用原始 token
|
||||
argv[argc++] = token;
|
||||
}
|
||||
token = strtok(NULL, " ");
|
||||
}
|
||||
argv[argc] = NULL; // execvp 需要以 NULL 结尾的数组
|
||||
argv[argc] = NULL;
|
||||
|
||||
// 执行命令
|
||||
// 3. 执行命令
|
||||
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 避免缓冲区刷新等操作
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue