嵌入式开发第26天(信号、system V IPC、内存映射)

本文详细介绍了信号处理机制,包括信号的捕获、等待、处理等,并深入探讨了sigaction函数及其应用。此外,还讲解了系统V IPC的重要组成部分——共享内存的基本概念与操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



signal
信号:
       #include <signal.h>

       void (*signal(int sig, void (*func)(int)))(int);
int sig:信号
void (*func)(int)))(int):回调函数

信号等待函数
       #include <unistd.h>
       int pause(void);


信号集清空
#include <signal.h>
int sigemptyset(sigset_t *set);//信号集清空
sigset_t set;


信号集添加
#include <signal.h>
int sigaddset(sigset_t *set, int signum);


信号集删除
#include <signal.h>
int sigdelset(sigset_t *set, int signum);

信号动作   //其实就是一个过滤系统,用sigaddset添加后,他就能先挡在外面,干自//己的,干完才放行
int sigprocmask(int how, const sigset_t *restrict set,

              sigset_t *restrict oset);


1.SIG_BLOCK:  阻塞动作  该值代表的功能是将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
2.SIG_UNBLOCK: 非阻塞动作  将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。



sigqueue-->跟kill一样,但它可以额外带参数


       #include <signal.h>
       int sigqueue(pid_t pid, int sig, const union sigval value);
pid_t pid:进程PID
int sig  :信号
const union sigval value:额外值


           union sigval {
               int   sival_int;
               void *sival_ptr;
           };


返回值: 成功:0
失败:-1


sigaction()功能强的信号处理函数

 //被定义的信号不会发生嵌套

//用于信号接收时,排队接收

//而阻止插队接收信号的发生



#include <signal.h>


       int sigaction(int sig, const struct sigaction *restrict act,
            struct sigaction *restrict oact);
int sig:信号
const struct sigaction *restrict act:新设置的动作
struct sigaction *restrict oact:目前的动作
返回值: 成功:0
失败:-1



 #include <signal.h>
 int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);


 struct sigaction 类型用来描述对信号的处理,定义如下:
 struct sigaction
 {
  void     (*sa_handler)(int);
  void     (*sa_sigaction)(int, siginfo_t *, void *);
  sigset_t  sa_mask;
  int       sa_flags;
  void     (*sa_restorer)(void);
 };


 
在这个结构体中,成员 sa_handler 是一个函数指针,其含义与 signal 函数中的信号处理函数类似。成员


sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。当 sa_flags 成员的值


包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理


函数。在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。
 sa_mask 成员用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被


自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。
 sa_flags 成员用于指定信号处理的行为,它可以是一下值的“按位或”组合。
 
 ◆ SA_RESTART:使被信号打断的系统调用自动重新发起。
 ◆ SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
 ◆ SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵


尸进程。
 ◆ SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
 ◆ SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
 ◆ SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。




           siginfo_t {
               int      si_signo;    /* Signal number */
               int      si_errno;    /* An errno value */
               int      si_code;     /* Signal code */
               int      si_trapno;   /* Trap number that caused
                                        hardware-generated signal
                                        (unused on most architectures) */
               pid_t    si_pid;      /* Sending process ID */
               uid_t    si_uid;      /* Real user ID of sending process */
               int      si_status;   /* Exit value or signal */
               clock_t  si_utime;    /* User time consumed */
               clock_t  si_stime;    /* System time consumed */
               sigval_t si_value;    /* Signal value */
               int      si_int;      /* POSIX.1b signal  信号传过来的参数*/
               void    *si_ptr;      /* POSIX.1b signal  信号传过来的参数*/




system V IPC


ipcs -l 查看IPC


 Shared Memory Limits:共享内存
 Semaphore Limits:信号量
 Messages Limits:消息队列


共享内存:
高效,直接操作物理内存,不需要任何的拷贝
向内核申请一块内存,映射到进程自身的虚拟地址空间中
可以直接读写这个进程中的空间,提高效率


 申请并新建一个共享内存
int shmget(key_t key, size_t size, int shmflg);


返回值: 成功:返回申请到的内存ID
失败:-1


key_t key:内存的键值
size_t size:大小
int shmflg:权限标志IPC_CREAT


内存映射
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);


返回值:成功:映射的地址:
const void *shmaddr:映射起始地址:
int shmflg:权限标志 0代表可读可以写


删除共享内存
       int shmctl(int shmid, int cmd, struct shmid_ds *buf);




int shmid:申请到的内存ID
int cmd:命令  IPC_RMID(删除)
struct shmid_ds *buf:0






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

交叉编译之王 hahaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值