更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_signal.h 文件参考

浏览源代码.

结构体

struct  sigset_t_l
 
struct  sigactq
 
struct  sq_entry_s
 
struct  sigpendq
 
struct  sq_queue_s
 
struct  SigInfoListNode
 
struct  sig_cb
 信号控制块(描述符) 更多...
 

类型定义

typedef void(* sa_sighandler_t) (int)
 
typedef void(* sa_siginfoaction_t) (int, siginfo_t *, void *)
 
typedef struct sigaction sigaction_t
 
typedef struct sigactq sigactq_t
 
typedef struct sq_entry_s sq_entry_t
 
typedef struct sigpendq sigpendq_t
 
typedef struct sq_queue_s sq_queue_t
 
typedef struct SigInfoListNode SigInfoListNode
 

函数

static int GOOD_SIGNO (unsigned int sig)
 信号ID是否有效 更多...
 
int sys_sigqueue (pid_t, int, const union sigval)
 
int sys_sigpending (sigset_t *)
 
int sys_rt_sigtimedwait (const sigset_t *mask, siginfo_t *si, const struct timespec *ts, size_t sigsetsize)
 
int sys_sigsuspend (const sigset_t *)
 
int OsKillLock (pid_t pid, int sig)
 给发送信号过程加锁 更多...
 
int OsSigAction (int sig, const sigaction_t *act, sigaction_t *oact)
 
int OsSigprocMask (int how, const sigset_t_l *set, sigset_t_l *oldset)
 
int OsPthreadKill (UINT32 tid, int signo)
 发送信号 更多...
 
int OsSigEmptySet (sigset_t *)
 信号集全部清0 更多...
 
int OsSigAddSet (sigset_t *, int)
 向信号集中加入signo信号 更多...
 
int OsSigIsMember (const sigset_t *, int)
 判定信号signo是否存在信号集中。如果信号集里已有该信号则返回1,否则返回0。如果有错误则返回-1 更多...
 
int OsKill (pid_t pid, int sig, int permission)
 
int OsDispatch (pid_t pid, siginfo_t *info, int permission)
 信号分发,发送信号权限/进程组过滤. 更多...
 
int OsSigTimedWait (sigset_t *set, siginfo_t *info, unsigned int timeout)
 让当前任务等待的信号 更多...
 
int OsPause (void)
 通过信号挂起当前任务 更多...
 
int OsSigPending (sigset_t *set)
 获取阻塞当前任务的信号集 更多...
 
int OsSigSuspend (const sigset_t *set)
 用参数set代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。 更多...
 
VOID OsSigIntLock (VOID)
 
VOID OsSigIntUnlock (VOID)
 
INT32 OsTaskKillUnsafe (UINT32 taskID, INT32 signo)
 
VOID OsClearSigInfoTmpList (sig_cb *sigcb)
 

详细描述

   信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。
   如果该进程当前并未处于执行状态,则该信号就由内核保存起来,直到该进程被调度执行并传递给它为止。
   如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

   软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,
   在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中异步通信机制,
   一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
   进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程
   发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

   信号量定义如下: 见于..\third_party\musl\arch\aarch64\bits\signal.h
   #define SIGHUP    1  //终端挂起或者控制进程终止
   #define SIGINT    2  //键盘中断(如break键被按下)
   #define SIGQUIT   3  //键盘的退出键被按下
   #define SIGILL    4  //非法指令
   #define SIGTRAP   5  //跟踪陷阱(trace trap),启动进程,跟踪代码的执行
   #define SIGABRT   6  //由abort(3)发出的退出指令
   #define SIGIOT    SIGABRT //abort发出的信号
   #define SIGBUS    7  //总线错误 
   #define SIGFPE    8  //浮点异常
   #define SIGKILL   9      //常用的命令 kill 9 123 | 不能被忽略、处理和阻塞
   #define SIGUSR1   10 //用户自定义信号1 
   #define SIGSEGV   11 //无效的内存引用, 段违例(segmentation     violation),进程试图去访问其虚地址空间以外的位置 
   #define SIGUSR2   12 //用户自定义信号2
   #define SIGPIPE   13 //向某个非读管道中写入数据 
   #define SIGALRM   14 //由alarm(2)发出的信号,默认行为为进程终止
   #define SIGTERM   15 //终止信号, kill不带参数时默认发送这个信号
   #define SIGSTKFLT 16 //栈溢出
   #define SIGCHLD   17 //子进程结束信号
   #define SIGCONT   18 //进程继续(曾被停止的进程)
   #define SIGSTOP   19 //终止进程       | 不能被忽略、处理和阻塞
   #define SIGTSTP   20 //控制终端(tty)上 按下停止键
   #define SIGTTIN   21 //进程停止,后台进程企图从控制终端读
   #define SIGTTOU   22 //进程停止,后台进程企图从控制终端写
   #define SIGURG    23 //I/O有紧急数据到达当前进程
   #define SIGXCPU   24 //进程的CPU时间片到期
   #define SIGXFSZ   25 //文件大小的超出上限
   #define SIGVTALRM 26 //虚拟时钟超时
   #define SIGPROF   27 //profile时钟超时
   #define SIGWINCH  28 //窗口大小改变
   #define SIGIO     29 //I/O相关
   #define SIGPOLL   29 //
   #define SIGPWR    30 //电源故障,关机
   #define SIGSYS    31 //系统调用中参数错,如系统调用号非法 
   #define SIGUNUSED SIGSYS     //系统调用异常

   #define _NSIG 65 //信号范围,不超过_NSIG

   https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html

   Musl官网 http://musl.libc.org/ 
   musl是构建在Linux系统调用API之上的C标准库的实现,包括在基本语言标准POSIX中定义的接口,
   以及广泛认可的扩展。musl是轻量级的,快速的,简单的,自由的.    
* 
参数
pathname
返回
int

在文件 los_signal.h 中定义.

类型定义说明

◆ sa_sighandler_t

typedef void(* sa_sighandler_t) (int)

在文件 los_signal.h151 行定义.

◆ sa_siginfoaction_t

typedef void(* sa_siginfoaction_t) (int, siginfo_t *, void *)

在文件 los_signal.h152 行定义.

◆ sigaction_t

typedef struct sigaction sigaction_t

在文件 los_signal.h186 行定义.

◆ sigactq_t

typedef struct sigactq sigactq_t

在文件 los_signal.h193 行定义.

◆ SigInfoListNode

◆ sigpendq_t

typedef struct sigpendq sigpendq_t

在文件 los_signal.h205 行定义.

◆ sq_entry_t

typedef struct sq_entry_s sq_entry_t

在文件 los_signal.h198 行定义.

◆ sq_queue_t

typedef struct sq_queue_s sq_queue_t

在文件 los_signal.h211 行定义.

函数说明

◆ GOOD_SIGNO()

static int GOOD_SIGNO ( unsigned int  sig)
inlinestatic

信号ID是否有效

在文件 los_signal.h158 行定义.

159{
160 return (sig < _NSIG) ? 1 : 0;//
161}
这是这个函数的调用关系图:

◆ OsClearSigInfoTmpList()

VOID OsClearSigInfoTmpList ( sig_cb sigcb)

在文件 los_signal.c123 行定义.

124{
125 while (sigcb->tmpInfoListHead != NULL) {
126 SigInfoListNode *tmpInfoNode = sigcb->tmpInfoListHead;
127 sigcb->tmpInfoListHead = sigcb->tmpInfoListHead->next;
128 (VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode);
129 }
130}
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
struct SigInfoListNode * next
Definition: los_signal.h:214
SigInfoListNode * tmpInfoListHead
Definition: los_signal.h:228
函数调用图:
这是这个函数的调用关系图:

◆ OsDispatch()

int OsDispatch ( pid_t  pid,
siginfo_t *  info,
int  permission 
)

信号分发,发送信号权限/进程组过滤.

在文件 los_signal.c412 行定义.

413{
414 if (OsProcessIDUserCheckInvalid(pid) || pid < 0) {
415 return -ESRCH;
416 }
417 LosProcessCB *spcb = OS_PCB_FROM_PID(pid);//找到这个进程
418 if (OsProcessIsUnused(spcb)) {//进程是否还在使用,不一定是当前进程但必须是个有效进程
419 return -ESRCH;
420 }
421
422 /* If the process you want to kill had been inactive, but still exist. should return LOS_OK */
423 if (OsProcessIsInactive(spcb)) {//不向非活动进程发送信息,但返回OK
424 return LOS_OK;
425 }
426
427#ifdef LOSCFG_SECURITY_CAPABILITY //启用能力安全模式
428 LosProcessCB *current = OsCurrProcessGet();//获取当前进程,检查当前进程是否有发送信号的权限.
429 /* Kernel process always has kill permission and user process should check permission *///内核进程总是有kill权限,用户进程需要检查权限
430 if (OsProcessIsUserMode(current) && !(current->processStatus & OS_PROCESS_FLAG_EXIT)) {//用户进程检查能力范围
431 if ((current != spcb) && (!IsCapPermit(CAP_KILL)) && (current->user->userID != spcb->user->userID)) {
432 return -EPERM;
433 }
434 }
435#endif
436 if ((permission == OS_USER_KILL_PERMISSION) && (OsSignalPermissionToCheck(spcb) < 0)) {
437 return -EPERM;
438 }
439 return OsSigProcessSend(spcb, info);//给参数进程发送信号
440}
BOOL IsCapPermit(UINT32 capIndex)
Definition: capability.c:43
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
进程不活跃函数定义:身上贴有不使用且不活跃标签的进程
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIDUserCheckInvalid(UINT32 pid)
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
static int OsSignalPermissionToCheck(const LosProcessCB *spcb)
Definition: los_signal.c:399
int OsSigProcessSend(LosProcessCB *spcb, siginfo_t *sigInfo)
给参数进程发送参数信号
Definition: los_signal.c:362
UINT16 processStatus
User * user
进程的拥有者
UINT32 userID
用户ID [0,60000],0为root用户
函数调用图:
这是这个函数的调用关系图:

◆ OsKill()

int OsKill ( pid_t  pid,
int  sig,
int  permission 
)
   用于向进程或进程组发送信号
   shell命令 kill 14 7(kill -14 7效果相同)
   发送信号14(SIGALRM默认行为为进程终止)给7号进程
* 

在文件 los_signal.c450 行定义.

451{
452 siginfo_t info;
453 int ret;
454
455 /* Make sure that the para is valid */
456 if (!GOOD_SIGNO(sig)) {
457 return -EINVAL;
458 }
459
460 /* Create the siginfo structure */ //创建信号结构体
461 info.si_signo = sig; //信号编号
462 info.si_code = SI_USER; //来自用户进程信号
463 info.si_value.sival_ptr = NULL;
464
465 if (pid > 0) {
466 /* Send the signal to the specify process */
467 ret = OsDispatch(pid, &info, permission);//发送信号
468 } else if (pid == -1) {
469 /* Send SIG to all processes */
470 ret = OsSendSignalToAllProcess(&info, permission);
471 } else {
472 /* Send SIG to all processes in process group PGRP.
473 If PGRP is zero, send SIG to all processes in
474 the current process's process group. */
475 ret = OsSendSignalToProcessGroup(pid, &info, permission);
476 }
477 return ret;
478}
LITE_OS_SEC_TEXT INT32 OsSendSignalToProcessGroup(INT32 pid, siginfo_t *info, INT32 permission)
Definition: los_process.c:262
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
Definition: los_process.c:242
int OsDispatch(pid_t pid, siginfo_t *info, int permission)
信号分发,发送信号权限/进程组过滤.
Definition: los_signal.c:412
static int GOOD_SIGNO(unsigned int sig)
信号ID是否有效
Definition: los_signal.h:158
函数调用图:
这是这个函数的调用关系图:

◆ OsKillLock()

int OsKillLock ( pid_t  pid,
int  sig 
)

给发送信号过程加锁

在文件 los_signal.c480 行定义.

481{
482 int ret;
483 unsigned int intSave;
484
485 SCHEDULER_LOCK(intSave);
486 ret = OsKill(pid, sig, OS_USER_KILL_PERMISSION);//用户权限向进程发送信号
487 SCHEDULER_UNLOCK(intSave);
488 return ret;
489}
int OsKill(pid_t pid, int sig, int permission)
Definition: los_signal.c:450
函数调用图:
这是这个函数的调用关系图:

◆ OsPause()

int OsPause ( void  )

通过信号挂起当前任务

在文件 los_signal.c617 行定义.

618{
619 LosTaskCB *spcb = NULL;
620 sigset_t oldSigprocmask;
621
622 spcb = OsCurrTaskGet();
623 oldSigprocmask = spcb->sig.sigprocmask;
624 return OsSigSuspend(&oldSigprocmask);
625}
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
int OsSigSuspend(const sigset_t *set)
用参数set代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。
Definition: los_signal.c:627
sig_cb sig
信号控制块,用于异步通信,类似于 linux singal模块
sigset_t sigprocmask
Signals that are blocked | 任务屏蔽了哪些信号
Definition: los_signal.h:223
函数调用图:
这是这个函数的调用关系图:

◆ OsPthreadKill()

int OsPthreadKill ( UINT32  tid,
int  signo 
)

发送信号

在文件 los_signal.c509 行定义.

510{
511 int ret;
512 UINT32 intSave;
513
514 /* Make sure that the signal is valid */
515 OS_RETURN_IF(!GOOD_SIGNO(signo), -EINVAL);
516 if (OS_TID_CHECK_INVALID(tid)) {
517 return -ESRCH;
518 }
519
520 /* Keep things stationary through the following */
521 SCHEDULER_LOCK(intSave);
522 ret = OsTaskKillUnsafe(tid, signo);
523 SCHEDULER_UNLOCK(intSave);
524 return ret;
525}
INT32 OsTaskKillUnsafe(UINT32 taskID, INT32 signo)
Definition: los_signal.c:490
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:
这是这个函数的调用关系图:

◆ OsSigAction()

int OsSigAction ( int  sig,
const sigaction_t act,
sigaction_t oact 
)
   信号安装,函数用于改变进程接收到特定信号后的行为。
   sig:信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。
   act:设置对signal信号的新处理方式。
   oldact:原来对信号的处理方式。
   如果把第二、第三个参数都设为NULL,那么该函数可用于检查信号的有效性。
   返回值:0 表示成功,-1 表示有错误发生。
* 

在文件 los_signal.c677 行定义.

678{
679 UINTPTR addr;
680 sigaction_t action;
681
682 if (!GOOD_SIGNO(sig) || sig < 1 || act == NULL) {
683 return -EINVAL;
684 }
685 //将数据从用户空间拷贝到内核空间
686 if (LOS_ArchCopyFromUser(&action, act, sizeof(sigaction_t)) != LOS_OK) {
687 return -EFAULT;
688 }
689
690 if (sig == SIGSYS) {//鸿蒙此处通过错误的系统调用 来安装信号处理函数,有点巧妙.
691 addr = OsGetSigHandler();//是否已存在信号处理函数
692 if (addr == 0) {//进程没有设置信号处理函数时
693 OsSetSigHandler((unsigned long)(UINTPTR)action.sa_handler);//设置进程信号处理函数
694 //void (*sa_handler)(int); //信号处理函数——普通版
695 //void (*sa_sigaction)(int, siginfo_t *, void *);//信号处理函数——高级版
696 return LOS_OK;
697 }
698 return -EINVAL;
699 }
700
701 return LOS_OK;
702}
LITE_OS_SEC_TEXT VOID OsSetSigHandler(UINTPTR addr)
设置进程的信号处理函数
Definition: los_process.c:2259
LITE_OS_SEC_TEXT UINTPTR OsGetSigHandler(VOID)
获取进程的信号处理函数
Definition: los_process.c:2264
struct sigaction sigaction_t
Definition: los_signal.h:186
unsigned long UINTPTR
Definition: los_typedef.h:68
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)
Definition: user_copy.c:58
函数调用图:
这是这个函数的调用关系图:

◆ OsSigAddSet()

int OsSigAddSet ( sigset_t *  set,
int  signo 
)

向信号集中加入signo信号

在文件 los_signal.c527 行定义.

528{
529 /* Verify the signal */
530 if (!GOOD_SIGNO(signo)) {
531 return -EINVAL;
532 } else {
533 /* In musl, sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
534 signo -= 1;// 信号范围是 [1 ~ 64 ],而保存变量位的范围是[0 ~ 63]
535 /* Add the signal to the set */
536 *set |= SIGNO2SET((unsigned int)signo);//填充信号集
537 return LOS_OK;
538 }
539}
函数调用图:
这是这个函数的调用关系图:

◆ OsSigEmptySet()

int OsSigEmptySet ( sigset_t *  set)

信号集全部清0

在文件 los_signal.c392 行定义.

393{
394 *set = NULL_SIGNAL_SET;
395 return 0;
396}
这是这个函数的调用关系图:

◆ OsSigIntLock()

VOID OsSigIntLock ( VOID  )

在文件 los_signal.c704 行定义.

705{
706 LosTaskCB *task = OsCurrTaskGet();
707 sig_cb *sigcb = &task->sig;
708
709 (VOID)LOS_AtomicAdd((Atomic *)&sigcb->sigIntLock, 1);
710}
STATIC INLINE INT32 LOS_AtomicAdd(Atomic *v, INT32 addVal)
Atomic addition.
Definition: los_atomic.h:173
volatile INT32 Atomic
Definition: los_atomic.h:102
信号控制块(描述符)
Definition: los_signal.h:220
unsigned int sigIntLock
信号中断锁
Definition: los_signal.h:229
函数调用图:
这是这个函数的调用关系图:

◆ OsSigIntUnlock()

VOID OsSigIntUnlock ( VOID  )

在文件 los_signal.c712 行定义.

713{
714 LosTaskCB *task = OsCurrTaskGet();
715 sig_cb *sigcb = &task->sig;
716
717 (VOID)LOS_AtomicSub((Atomic *)&sigcb->sigIntLock, 1);
718}
STATIC INLINE INT32 LOS_AtomicSub(Atomic *v, INT32 subVal)
Atomic subtraction.
Definition: los_atomic.h:217
函数调用图:
这是这个函数的调用关系图:

◆ OsSigIsMember()

int OsSigIsMember ( const sigset_t *  set,
int  signo 
)

判定信号signo是否存在信号集中。如果信号集里已有该信号则返回1,否则返回0。如果有错误则返回-1

参数
set
signo
返回
int

在文件 los_signal.c62 行定义.

63{
64 int ret = LOS_NOK;
65 /* In musl, sig No bits 00000100 present sig No 3, but 1<< 3 = 00001000, so signo needs minus 1 */
66 //在musl中,sig No bits 00000100表示sig No 3,但是在SIGNO2SET中 1<<3 = 00001000,因此signo需要减1
67 signo -= 1;
68 /* Verify the signal */
69 if (GOOD_SIGNO(signo)) {//有效信号判断
70 /* Check if the signal is in the set */
71 ret = ((*set & SIGNO2SET((unsigned int)signo)) != 0);//检查信号是否还在集合中
72 }
73
74 return ret;
75}
函数调用图:
这是这个函数的调用关系图:

◆ OsSigPending()

int OsSigPending ( sigset_t *  set)

获取阻塞当前任务的信号集

在文件 los_signal.c541 行定义.

542{
543 LosTaskCB *tcb = NULL;
544 unsigned int intSave;
545
546 if (set == NULL) {
547 return -EFAULT;
548 }
549
550 SCHEDULER_LOCK(intSave);
551 tcb = OsCurrTaskGet();
552 *set = tcb->sig.sigPendFlag;//被阻塞的信号集
553 SCHEDULER_UNLOCK(intSave);
554 return LOS_OK;
555}
sigset_t sigPendFlag
信号阻塞标签集,记录那些信号来过,任务依然阻塞的集合.即:这些信号不能唤醒任务
Definition: los_signal.h:222
函数调用图:
这是这个函数的调用关系图:

◆ OsSigprocMask()

int OsSigprocMask ( int  how,
const sigset_t_l setl,
sigset_t_l oldsetl 
)
   向信号集设置信号屏蔽的方法
       SIG_BLOCK:将set指向信号集中的信号,添加到进程阻塞信号集;
       SIG_UNBLOCK:将set指向信号集中的信号,从进程阻塞信号集删除;
       SIG_SETMASK:将set指向信号集中的信号,设置成进程阻塞信号集;
* 

在文件 los_signal.c233 行定义.

234{
235 LosTaskCB *spcb = NULL;
236 int ret = LOS_OK;
237 unsigned int intSave;
238 sigset_t set;
239
240 SCHEDULER_LOCK(intSave);
241 spcb = OsCurrTaskGet();
242 /* If requested, copy the old mask to user. | 如果需要,请将旧掩码复制给用户*/
243 if (oldsetl != NULL) {
244 *(sigset_t *)oldsetl = spcb->sig.sigprocmask;
245 }
246 /* If requested, modify the current signal mask. | 如有要求,修改当前信号屏蔽*/
247 if (setl != NULL) {
248 set = *(sigset_t *)setl;
249 /* Okay, determine what we are supposed to do */
250 switch (how) {
251 /* Set the union of the current set and the signal
252 * set pointed to by set as the new sigprocmask.
253 */
254 case SIG_BLOCK:
255 spcb->sig.sigprocmask |= set;//增加信号屏蔽位
256 break;
257 /* Set the intersection of the current set and the
258 * signal set pointed to by set as the new sigprocmask.
259 */
260 case SIG_UNBLOCK:
261 spcb->sig.sigprocmask &= ~(set);//解除信号屏蔽位
262 break;
263 /* Set the signal set pointed to by set as the new sigprocmask. */
264 case SIG_SETMASK:
265 spcb->sig.sigprocmask = set;//设置一个新的屏蔽掩码
266 break;
267 default:
268 ret = -EINVAL;
269 break;
270 }
271 /* If pending mask not in sigmask, need set sigflag. */
272 OsSigMaskSwitch(spcb, spcb->sig.sigprocmask);//更新与屏蔽信号相关的变量
273 }
274 SCHEDULER_UNLOCK(intSave);
275
276 return ret;
277}
void OsSigMaskSwitch(LosTaskCB *const rtcb, sigset_t set)
Definition: los_signal.c:211
函数调用图:
这是这个函数的调用关系图:

◆ OsSigSuspend()

int OsSigSuspend ( const sigset_t *  set)

用参数set代替进程的原有掩码,并暂停进程执行,直到收到信号再恢复原有掩码并继续执行进程。

在文件 los_signal.c627 行定义.

628{
629 unsigned int intSave;
630 LosTaskCB *rtcb = NULL;
631 sigset_t setSuspend;
632 int ret;
633
634 if (set == NULL) {
635 return -EINVAL;
636 }
637 SCHEDULER_LOCK(intSave);
638 rtcb = OsCurrTaskGet();
639
640 /* Wait signal calc */
641 setSuspend = FULL_SIGNAL_SET & (~(*set));
642
643 /* If pending mask not in sigmask, need set sigflag */
644 OsSigMaskSwitch(rtcb, *set);
645
646 if (rtcb->sig.sigFlag > 0) {
647 SCHEDULER_UNLOCK(intSave);
648
649 /*
650 * If rtcb->sig.sigFlag > 0, it means that some signal have been
651 * received, and we need to do schedule to handle the signal directly.
652 */
653 LOS_Schedule();
654 return -EINTR;
655 } else {
656 ret = OsSigTimedWaitNoLock(&setSuspend, NULL, LOS_WAIT_FOREVER);
657 if (ret < 0) {
658 PRINT_ERR("FUNC %s LINE = %d, ret = %x\n", __FUNCTION__, __LINE__, ret);
659 }
660 }
661
662 SCHEDULER_UNLOCK(intSave);
663 return -EINTR;
664}
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
Definition: los_sched.c:469
int OsSigTimedWaitNoLock(sigset_t *set, siginfo_t *info, unsigned int timeout)
等待信号时间
Definition: los_signal.c:568
sigset_t sigFlag
不屏蔽的信号集
Definition: los_signal.h:221
函数调用图:
这是这个函数的调用关系图:

◆ OsSigTimedWait()

int OsSigTimedWait ( sigset_t *  set,
siginfo_t *  info,
unsigned int  timeout 
)

让当前任务等待的信号

在文件 los_signal.c604 行定义.

605{
606 int ret;
607 unsigned int intSave;
608
609 SCHEDULER_LOCK(intSave);
610
611 ret = OsSigTimedWaitNoLock(set, info, timeout);//以不加锁的方式等待
612
613 SCHEDULER_UNLOCK(intSave);
614 return ret;
615}
函数调用图:
这是这个函数的调用关系图:

◆ OsTaskKillUnsafe()

INT32 OsTaskKillUnsafe ( UINT32  taskID,
INT32  signo 
)

在文件 los_signal.c490 行定义.

491{
492 siginfo_t info;
493 LosTaskCB *taskCB = OsGetTaskCB(taskID);
495 if (ret != LOS_OK) {
496 return -ret;
497 }
498
499 /* Create the siginfo structure */
500 info.si_signo = signo;
501 info.si_code = SI_USER;
502 info.si_value.sival_ptr = NULL;
503
504 /* Dispatch the signal to thread, bypassing normal task group thread
505 * dispatch rules. */
506 return OsTcbDispatch(taskCB, &info);
507}
int OsTcbDispatch(LosTaskCB *stcb, siginfo_t *info)
给任务(线程)发送一个信号
Definition: los_signal.c:182
INT32 OsUserTaskOperatePermissionsCheck(const LosTaskCB *taskCB)
Definition: los_task.c:1380
STATIC INLINE LosTaskCB * OsGetTaskCB(UINT32 taskID)
通过任务ID获取任务实体,task由任务池分配,本质是个数组,彼此都挨在一块
Definition: los_task_pri.h:250
signed int INT32
Definition: los_typedef.h:60
函数调用图:
这是这个函数的调用关系图:

◆ sys_rt_sigtimedwait()

int sys_rt_sigtimedwait ( const sigset_t *  mask,
siginfo_t *  si,
const struct timespec *  ts,
size_t  sigsetsize 
)

◆ sys_sigpending()

int sys_sigpending ( sigset_t *  )

◆ sys_sigqueue()

int sys_sigqueue ( pid_t  ,
int  ,
const union sigval   
)

◆ sys_sigsuspend()

int sys_sigsuspend ( const sigset_t *  )