• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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