1# 方舟编译运行时子系统变更说明 2 3## cl.arkcompiler.1 信号处理方法注册接口sigaction支持SA_RESETHAND标志位变更 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11sigaction是由C库提供的用于注册信号处理方法的接口,开发者可通过调用此接口,指定应用在接收到特定信号时采取的处理方式。 12 13本次变更是对齐[POSIX标准](https://pubs.opengroup.org/onlinepubs/007904875/functions/sigaction.html),信号处理方法注册接口sigaction支持SA_RESETHAND标志位。 14 15 16**变更影响** 17 18此变更涉及应用适配。 19 20若应用调用sigaction接口设置信号处理方法时,未指定SA_RESETHAND标志位,则变更前后无影响。 21 22若应用设置信号处理方法时,指定了SA_RESETHAND标志位,则变更前后存在如下差异: 23 24变更前:sigaction接口未支持SA_RESETHAND标志位,应用每次收到信号,均会执行其注册的信号处理方法。 25 26变更后:sigaction接口支持SA_RESETHAND标志位,应用首次收到信号会执行其注册的信号处理方法,其后根据POSIX标准,处理方法被重置为默认值 27SIG_DFL,后续收到信号会按照内核默认方式处理。内核默认处理方式与信号编号有关,包括忽略信号、终止进程、终止进程并生成转储文件,若误用了SA_RESETHAND标志位,在本次变更后,可能会导致应用退出,请开发者务必重视排查。 28 29**起始 API Level** 30 31API 11 32 33**变更发生版本** 34 35从OpenHarmony SDK 5.0.0.59 36 37**变更的接口/组件** 38 39musl/signal.h中sigaction接口 40 41**适配指导** 42 431. 全局搜索sigaction接口调用,查看设置信号处理方法相关代码。 44 452. 排查入参sigaction结构体中sa_flags中是否指定了SA_RESETHAND标志位(SA_RESETHAND是POSIX标准名字,SA_ONESHOT是过时的非标准名字,二者作用一致)。 46 473. 若应用的预期是信号处理方法只生效一次,需要显式指定SA_RESETHAND标志位,若应用预期信号处理方法多次生效,则移除SA_RESETHAND标志位,避免该标志位使能后信号处理方法恢复为默认值SIG_DFL,对应用造成闪退影响。 48 494. 在调用sigaction方法前,请按需设置sa_flags标志位,避免未初始化的随机值(可能包含SA_RESETHAND标志位)产生应用预期外的行为。 50 51示例代码: 52 53```cpp 54// 情况一:若应用预期是信号处理方法注册后只生效一次,其后恢复为默认值SIG_DFL,需要显式指定SA_RESETHAND标志位 55struct sigaction sa; 56 57// 请重点排查sigaction结构体的sa_flags标志位,该示例中显式指定SA_RESETHAND标志位,此处可根据业务需要,合理添加其它标志位 58sa.sa.sa_flags = SA_RESETHAND; 59sa.sa_handler = func; 60ret = sigaction(SIGUSR1, &sa, NULL); 61if (ret < 0) { 62 perror("sigaction error"); 63 return -1; 64} 65 66//情况二:若应用预期是信号处理方法注册后持续生效,则sa_flags不允许包含SA_RESETHAND标志位 67struct sigaction sa; 68 69// 请重点排查sigaction结构体的sa_flags标志位,确保不包含SA_RESETHAND标志位,此处可根据业务需要,合理添加其它标志位,此处示例为0 70sa.sa_flags = 0 71sa.sa_handler = func; 72ret = sigaction(SIGUSR1, &sa, NULL); 73if (ret < 0) { 74 perror("sigaction error"); 75 return -1; 76} 77``` 78 79