`
macintosh
  • 浏览: 11977 次
社区版块
存档分类
最新评论

信号sigaction

阅读更多
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
	struct sigaction act;	
	int sig;
	sig=atoi(argv[1]);
	
	sigemptyset(&act.sa_mask);
	act.sa_flags=SA_SIGINFO;
	act.sa_sigaction=new_op;
	
	if(sigaction(sig,&act,NULL) < 0)
	{
		printf("install sigal error\n");
	}
	
	while(1)
	{
		sleep(2);
		printf("wait for the signal\n");
	}
}
void new_op(int signum,siginfo_t *info,void *myact)
{
	printf("receive signal %d", signum);
	sleep(5);
}

说明,命令行参数为信号值,后台运行./a.out signo &,可获得该进程的ID,假设为pid,然后再另一终端上运行kill -s signo pid验证信号的发送接收及处理。同时,可验证信号的排队问题。
注:可以用sigqueue实现一个命令行信号发送程序sigqueuesend
----------------不同进程间传递整型参数:把1中的信号发送和接收放在两个程序中,并且在发送过程中传递整型参数。
信号接收程序:-----------

mac下不通
redhat5.4好使
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
void new_op(int,siginfo_t*,void*);
int main(int argc,char**argv)
{
	struct sigaction act;
	int sig;
	pid_t pid;		
	
	pid=getpid();
	sig=atoi(argv[1]);	
	
	sigemptyset(&act.sa_mask);
	act.sa_sigaction=new_op;
	act.sa_flags=SA_SIGINFO;
	if(sigaction(sig,&act,NULL)<0)
	{
		printf("install sigal error\n");
	}
	while(1)
	{
		sleep(2);
		printf("wait for the signal\n");
	}
}
void new_op(int signum,siginfo_t *info,void *myact)
{
	printf("the int value is %d \n",info->si_int);
}

#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/types.h>
main(int argc,char**argv)
{
	pid_t pid;
	int signum;
	union sigval mysigval;
	signum=atoi(argv[1]);
	pid=(pid_t)atoi(argv[2]);
	mysigval.sival_int=8;//不代表具体含义,只用于说明问题
	if(sigqueue(pid,signum,mysigval)==-1)
		printf("send error\n");
	sleep(2);
}

kill -l观察
mac(lion)下31个,freebsd(8.2)下32个 多个lwp
redhat5.4下64个

signal定义在哪在mac下也没找到,
信号定义顺序在redhat和bsd下也不一样,bsd和mac相同(废话,mac也是bsd嘛)


参考http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html
分享到:
评论

相关推荐

    信号捕捉函数sigaction

    ### 信号捕捉函数sigaction详解 #### 一、引言 在计算机编程中,尤其是在Linux环境下,信号(Signal)作为一种重要的通信机制被广泛应用于进程间通信。为了更好地控制信号的行为,POSIX标准引入了`sigaction`函数...

    linux进程间通信——信号机制

    本篇文章将深入探讨Linux信号机制,包括其基本概念、主要函数如`signal`和`sigaction`的使用方法,以及相关实例。 首先,信号是内核向进程传递信息的一种机制,它可以用来中断进程的正常执行,或者通知进程发生了...

    liunx信号概念及c信号函数的使用

    3. **`sigaction()`函数**:更强大的信号处理函数,可以设置信号掩码、控制信号传递等。其原型为`int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)`。 示例: ```c struct ...

    Linux系统调用 sigaction 的用法

    sigaction 函数原型定义如下:  int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact)  这个系统调用的作用是改变进程接收到的指定信号的行动。  使用这个函数需要包含头文件#...

    C++信号处理类,包括常用的信号处理方法

    `sigaction`提供了更高级的信号处理机制,允许保留信号的默认行为,或者设置信号的标志,如SA_RESTART,防止被信号中断的系统调用自动重启。 此外,`process`类可能还包括一些辅助函数,比如用于同步和异步信号处理...

    信号处理函数解析,signal ,sleep,raise等等函数的使用

    信号处理函数解析,signal,sleep,raise 等函数的使用 ...alarm 函数用于设置信号 SIGALRM,kill 函数用于传送信号给指定的进程,pause 函数用于让进程暂停直到信号出现,sigaction 函数用于查询或设置信号处理方式。

    常用C信号处理函数 常用C信号处理函数

    `sigaction()` 函数提供了更灵活的方式来管理信号处理器,允许用户自定义信号处理的方式。 **函数原型:** ```c #include int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ``...

    第9章linux信号与定时器

    - `struct sigaction`:定义了信号处理动作,包含信号处理函数指针、信号掩码、标志位和恢复函数指针。 - `struct timeval`:用于表示时间,包括秒和微秒部分。 - `struct itimerval`:包含两个`struct timeval`...

    Linux 信号signal处理机制

    - `sigaction`:更高级的接口,可以设置信号处理函数并控制信号行为。 5. **信号的行为** - **默认行为**:大多数信号如果不被显式处理,会采取默认操作,如进程终止或核心转储。 - **累积性**:某些信号(如`...

    Linux信号基础知识

    - `sigaction`信号处理注册:通过`struct sigaction`结构体,用户可以指定信号处理函数、信号掩码、信号行为等。 - `sigprocmask`信号阻塞:`sigprocmask`函数允许进程临时改变其信号掩码,即决定哪些信号在当前...

    Linux信号在进程控制中的应用

    sigaction系统调用允许获取和设置与信号相关的详细处理动作和标志。 通过这些系统调用,Linux进程可以实现多种信号处理模型: - 忽略信号模型:通过设置信号处理函数为SIG_IGN来忽略信号,例如忽略SIGINT信号。 - ...

    Linux的信号实现机制

    自定义处理函数通过`signal`或`sigaction`系统调用设置,允许进程捕获并处理信号。 4. **信号屏蔽**:进程可以使用`sigprocmask`系统调用来暂时屏蔽某些信号,使得在调用期间这些信号不会被处理。这在需要避免信号...

    中断信号处理

    而自定义处理则可以通过`signal`或`sigaction`函数设置,允许程序定义接收到特定信号时的行为,例如忽略信号、执行特定函数或按照默认方式进行处理。 信号集是用于管理和控制进程接收信号的集合,包括待处理信号集...

    unix信号和处理方式

    在这个示例中,我们定义了一个简单的信号处理器函数`my_signal_handler`,并通过`sigaction`将其设置为`SIGINT`信号的处理器。当用户按下`Ctrl+C`时,进程将收到`SIGINT`信号,并调用自定义的处理器函数。 #### ...

    Linux信号量处理

    在实际应用中,可以通过sigaction结构和sigaction()函数替代signal()函数,因为sigaction()提供了更强大的信号处理能力,例如处理信号时阻塞其他信号的传递。sigprocmask()函数用于改变当前进程的信号掩码,这个信号...

    Linux信号——IBM教程

    - `sigaction()`:这是一种更为强大的信号安装函数,支持更多选项,例如传递额外信息给信号处理函数。 **信号发送** - `kill()`:最常用的信号发送函数之一,用于向指定进程发送信号。 - `raise()`:用于向进程...

    进程信号的处理过程.docx

    首先,信号的安装是通过`signal`和`sigaction`系统调用来完成的。进程在接收到信号之前,必须先设定当特定信号发生时应如何处理,这被称为安装信号。例如,进程可以选择忽略信号、自定义处理函数或执行系统默认操作...

Global site tag (gtag.js) - Google Analytics