您的位置:首页 > 教育 > 培训 > 无印良品官方网络商城_网站建设的目的_seo三人行论坛_济南百度竞价

无印良品官方网络商城_网站建设的目的_seo三人行论坛_济南百度竞价

2025/4/16 6:06:56 来源:https://blog.csdn.net/weixin_74154742/article/details/147256533  浏览:    关键词:无印良品官方网络商城_网站建设的目的_seo三人行论坛_济南百度竞价
无印良品官方网络商城_网站建设的目的_seo三人行论坛_济南百度竞价

1.什么是信号:

信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。

比如内存段冲突、浮点处理器错误或者非法指令等

信号模拟的是硬件中断方式,它传递的信息很少,可以用来做进程间的通知或者错误的警告等

信号就是【进程间通信】的一种方式,它采用异步工作的方式(qt的信号与槽,线程)

2.信号类型:

linux中的指令:kill -l

总共定义了31*2种信号,分为可靠信号(34-64)与不可靠信号(1-31)

linux信号机制基本上是从unix系统中继承过来的。早期unix系统中的信号有1-31的信号

kill命令:kill -9 进程号    (发送9号信号)

3.信号的产生

硬件方式:ctrl+c(结束进程),出错

软件方式:发送信号的系统调用,例如kill

4.信号的安装

安装:设置信号的关联动作(当信号发生时要做什么事)

signal函数原型:

void signal(int sig, void (*func)(int))(int);

参数:

sig:要安装的信号的编号(上面截图不同信号前面的编码)

func:信号处理器(信号处理函数)

注:SIGKILL:是一个特殊的信号,即便被安装,也依然会执行默认动作(停止当前进程)

5.使用代码来发送信号

系统调用函数kill (发送信号)

int kill(pid_t pid, int sig);

参数:

pid:进程号(要发送信号的目标进程号)

  • pid>0:向指定的进程号发送信号
  • pid==0:向同组的进程发送信号
  • pid==-1:向所有进程发送信号(但不包括初始进程和部分系统进程)
  • pid<-1:向进程组id为pid的所有进程发送信号

sig:信号编号

返回值:成功返回0,错误返回-1

可靠信号:在程序运行速度很快,连续发送信号之间不需要sleep

不可靠信号:在程序运行速度很快,连续发送信号之间需要sleep,不然系统会忽略

6.带参信号的发送与处理

6.1、sigaction信号安装函数(替代之前的signal)

int  sigaction(int signum,const struct sigaction *act,const struct sigaction *old);

参数:

signum:信号编号

act:指向新的信号处理器设置指针

old:填NULL

struct sigaction {
    void     (*sa_handler)(int); // 信号处理器函数
    void     (*sa_sigaction)(int, siginfo_t *, void *); // 用于支持实时信号
    sigset_t sa_mask; // 在信号处理期间需要屏蔽的信号集
    int      sa_flags; // 信号处理选项
};

6.2、sigqueue信号发送函数(替代之前的kill)

int sigqueue(pid_t pid, int sig, const union sigval value);

参数:pid:进程号(要发送信号的目标进程号)

sig:信号编号

value:用于传递附加数据的联合体

union sigval {
    int   sival_int;     // 整数值
    void *sival_ptr;     // 指针值
};

进行数据传参

void demo4_handle(int signum,siginfo_t* info,void *v)
{cout << "signum:" << signum << endl;//携带数据cout << "value:" << info->si_value.sival_int << endl;
}void demo4()
{pid_t pid = 0;pid = fork();if (pid < 0){perror("fork error");}if (pid == 0){struct sigaction action;//信号处理器参数配置结构体action.sa_flags = SA_SIGINFO;//配置信号处理器类型为可携带参数类型action.sa_sigaction = demo4_handle;//配置信号处理函数//信号安装sigaction(SIGRTMIN, &action, NULL);while (1){}}else{sleep(1);union sigval val;val.sival_int = 10000;//要携带的数据(必须是整型)sigqueue(pid, SIGRTMIN, val);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com