导航:首页 > 操作系统 > linuxsigusr1

linuxsigusr1

发布时间:2022-08-30 23:45:44

1. linux系统中SIGUSR1信号是如何产生的。

首先,Linux中的信号可以通过kill -l命令获取,如下图所示:

如上图所示,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。


其次,SIGUSR1 ,这是留给用户使用的信号。一般在编程中使用。举例说明:sigqueue向本进程发送数据的信号,C语言代码如下 :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void myhandler(int signo,siginfo_t *si,void *ucontext);
int main(){
union sigval val;//定义一个携带数据的共用体
struct sigaction oldact,act;
act.sa_sigaction=myhandler;
act.sa_flags=SA_SIGINFO;//表示使用sa_sigaction指示的函数,处理完恢复默认,不阻塞处理过程中到达下在被处理的信号
//注册信号处理函数
sigaction(SIGUSR1,&act,&oldact);
char data[100];
int num=0;
while(num<10){
sleep(2);
printf("等待SIGUSR1信号的到来 ");
sprintf(data,"%d",num++);
val.sival_ptr=data;
sigqueue(getpid(),SIGUSR1,val);//向本进程发送一个信号
}

}
void myhandler(int signo,siginfo_t *si,void *ucontext){
printf("已经收到SIGUSR1信号 ");
printf("%s ",(char*)(si->si_ptr));

}

2. linux c signal函数

是第二次调用的时候输出的,第一次调用只是绑定了SIGUSR1的信号处理函数,不会进入该处理函数

为什么会有这样的输出呢?
signal函数是将信号与处理函数进行绑定,成功绑定则返回绑定之前的信号处理函数。那么来看看你的代码,第一次调用将sig_fun1绑定,无输出;第二次调用将sig_fun2绑定,也就是把sig_fun1替换下来,并且你还调用了它,参数为30,所以会有那样的输出。

该如何改呢?
其实你并没有涉及到linux的信号处理机制,光绑定是不够的,还需要发信号给它,才能真正进入信号处理过程。给你一个示例代码吧
#include<signal.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>

void sig_fun2(int signo)
{
printf("in sig_fun2:%d\n", signo);
}

void sig_fun1(int signo)
{
printf("in sig_fun1:%d\n", signo);
}

int main()
{
unsigned long i;
if (signal(SIGUSR1, sig_fun1) == SIG_ERR)
{
printf("signal fun1 error\n");
exit(1);
}
sleep(15);

(signal(SIGUSR1, sig_fun2))(30);
sleep(15);

printf("done\n");
return 0;
}
/****************************C 代码完,下面是如何运行***************************/
首先编译,假设生成可执行程序为test
然后运行,我用的是后台运行: nohup ./test>output.txt &
注意,这种方法要将输出重定向到文件output.txt(名字无所谓),然后你会看到一个数字,就是pid进程号
最后,在15秒之内发送信号:kill -SIGUSR1 进程号
现在你就可以打开output.txt看输出结果了。如果用sleep的话会被打断,所以只有两个输出加上替换处理函数时的输出共3个,也可以换成 int n=15;while(n--)sleep(1);
-------------------------------------------------------------
怎么样,加分吧
-------------------------------------------------------------
1.我就是想问第二次绑定sig_fun2的时候,调用了第一次绑定的sig_fun1么?
调用了, (signal(SIGUSR1, sig_fun2))(30);就是这一句, signal(SIGUSR1, sig_fun2)是个函数指针,你这样写就是调用它了,但是这和信号处理没关系,写成signal(SIGUSR1, sig_fun2);就可以了
这就是你所说的成功则返回绑定之前的函数???

那当时绑定sig_fun1的时候,返回之前的处理函数是什么??
这个就是系统默认的了,比如SIGINT就是你ctrl+c取消程序执行发送的信号,它的处理函数就是结束程序的一系列动作,不过SIGUSR1是留给用户自定义的信号,系统默认应该是啥也不做的一个函数,例如void fun(int signo){},你也可以第一次绑定的时候就调用试试看对不对

2.还有我在看signal函数定义的时候,void(//...)(int) 最后传入的这个int整形参数就是我们自定义sig_fun()中所接收的30么??我看例子里面有的signal(SIGINT,myfunc);也没有带参数啊,搞不懂
是你理解错了,signal函数只是绑定,没涉及到调用绑定函数,不用带参数,信号处理函数不是像你这样调用的。callback回调你知道吧,就是先做好一个函数或过程放着,事件触发的时候才调用。那个30是你用普通函数调用的方式时的参数,跟信号处理一点关系也没有,你用60,70也没半毛钱关系。我猜你是想要调用信号处理函数,然后迷糊了,其实我上面说的“kill -SIGUSR1 进程号”就是触发程序调用该处理函数的信号,这和kill -9 杀死进程一个道理,只不过处理函数不同,结果不一样。ctrl+c也可以用信号的方式发送,kill -2 进程号,或者 kill -SIGINT 进程号
另外,站长团上有产品团购,便宜有保证

3. linux 为什么会一直有SIGUSR1信号

因为根本没有信号。你的逻辑如同以下程序:

void speak_up(){
puts("I'm dying!!!");
}

int main(){
while(true){
speak_up();
sleep(1);
}
}

这个程序为什么会一直说它要死了但是却没有死掉呢?

4. Linux下怎么通过组合键产生sigusr1信号

SIGUSR1 不是终端产生的信号
kill -USR1 pid

5. linux下关于signal(SIGUSR1,sig_usr)==SIG_ERR的错误如何解决

SIG_ERR它表示一个函数指针,如果不出错的话,signal()会返回以前的信号处理函数的地址。
你的SIGUSER1定义了吗?默认的话,系统没有这一个信号
SIG_ERR是这样定义的
#define SIG_ERR (void (*) () ) -1

6. linux中求怎么通知epoll

让其一开始就监听一个pipe的读端,如果要让其停止,则向pipe的写端写入一字节,或者关闭写端等等。 这样epoll_wait返回后,检测状态改变的是否为此pipe,,是,则进入退出处理过程。

或者首先设置一个标志位flag ,,, 向进程发送一个信号看看,先用signal(SIGUSR1, handler),
然后epoll_wait时,,向此进程发送信号kill(pid, SIGUSR1);
handler可以是空函数,什么都不作。。 从理论上epoll_wait应该会返回-1, errno == EINTR. 然后你就检测下某个flag是否置位,如果置位,代表要退出了。 这种方案没试验过。。 用上一种方案好些,

7. linux 可以定义几个自定义的信号量,难道就只有SIGUSR1 SIGUSR2 这个两个吗 求大神解释

你的想法是想让自己的信号处理函数代替系统的信号处理函数吧,那个信号都可以发送,不过linux内核为用户程序保留了两个信号,一个是10 siguser1 还有12 siguser2,其他的信号都是系统所用,你也可以更改。

8. linux备份系统到新硬盘

连接好新硬盘,开机,进入系统(废话!)
fdisk -l ; 由于我两块硬盘都是Sata的,所以fdisk -l出来的结果是sda(旧) sdb(新)
dd if=/dev/sda of=/dev/sdb ; 注意的是最好两块硬盘是同一容量和同一型号,否则比较麻烦。
等待,漫长的等待
关机,将两个硬盘的接口更换一下。
finish
dd的方式有点类似于ghost的全盘复制,速度较慢,但不会出现ghost那样无法启动的现象。制作linux的软raid1也可以尝试用这种方式同步。
PS:dd过程中如果无聊,可以通过在另一个终端键入 killall -s SIGUSR1 dd 发送SIGUSR1信号获取当前进度

阅读全文

与linuxsigusr1相关的资料

热点内容
记事本dos命令 浏览:272
服务器如何搭建多个节点 浏览:324
acx算法 浏览:256
幽冥诡匠漫画全集用什么app可以看 浏览:1001
租用服务器为什么越来越慢 浏览:960
算法创新就业方向 浏览:423
算法最优解作者 浏览:868
通达信红绿宝塔线指标源码 浏览:667
app是什么东西合法吗 浏览:231
怎么锁app视频教程 浏览:841
迅捷pdf注册码生成器 浏览:748
androidsdkosx 浏览:303
压缩面膜纸荧光 浏览:841
app怎么分身三个 浏览:744
电影bt下载源码 浏览:422
iwatch屏幕加密芯片 浏览:570
公安主题网站源码 浏览:986
天津市服务器供应商云服务器 浏览:116
数控车床子程序编程 浏览:112
floydwarshall算法 浏览:720