mirror of
				https://github.com/DreamMaoMao/maomaowm.git
				synced 2025-11-03 09:01:47 -05: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) {
 | 
					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 避免缓冲区刷新等操作
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue