Linux环境编程之信号(三):一些信号函数

(一)kill和raise函数

kill函数将信号发送给进程或进程组。raise函数则允许进程自身发送信号。

       #include <sys/types.h>
       #include <signal.h>
       int kill(pid_t pid, int sig);

       int raise(int  signo);  //返回值:若成功则返回0,若出错则返回-1。

参数:pid参数有4种情况:1、pid > 0 将信号发送给进程为pid的进程。2、pid == 0 将该信号发送给与发送进程属于同一进程组的所有进程,而且发送进程具有向这些进程发送信号的权限。3、pid  < 0 将该信号发送给其进程组ID等于pid的绝对值,而且发送进程具有向其发送信号的权限。4、pid == -1 将该信号发送给进程有权限向它们发送信号的系统上的所有进程。signo可以是0,此时kill仍执行正常的错误检查,但不发送信号。这常被用来确定一个特定进程是否仍旧存在。如果向一个并不存在的进程发送空信号,则kill返回-1,并将errno设置为ESRCH。注意:对于进程是否存在的这种测试不是原子操作。在kill向调用者返回测试结果时,原来存在的被测试进程此时可能已经终止。

程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

#define ERR_EXIT(m) \
	do{\
		perror(m);\
		exit(EXIT_FAILURE);\
	}while(0)

void handler(int sig);

int
main(int argc, char *argv[])
{
	if(signal(SIGUSR1, handler) == SIG_ERR)
		ERR_EXIT("signal error");
	pid_t pid = fork();
	if(pid == -1)
		ERR_EXIT("fork error");

	if(pid == 0){
		killpg(getpgrp(), SIGUSR1);
		exit(EXIT_SUCCESS);	
	}

	int n = 5;
	do{
		n = sleep(n);	
	}
	while(n > 0);

	return 0;
}

void handler(int sig)
{
	printf("recv a sig = %d\n", sig);
}


(二)alarm和pause函数

使用alarm函数可以设置一个计时器,在将来某个指定的时间该计时器会超时。当计时器超时时,产生SIGALRM信号。如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程。

#include <unistd.h>

unsigned int alarm(unsigned int seconds); // 返回值:0或以前设置的闹钟时间的余留秒数。

其中参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM,该信号是由内核产生的。

pause函数使调用进程挂起直至捕捉到一个信号。

#include <unistd.h>

int pause(void); //返回值: -1,并将errno设置为EINTR

只有执行一个信号处理程序并返回时,pause才返回。在这种情况下,pause返回-1,并将errno设置为EINTR。

程序引自:http://blog.csdn.net/jnu_simba/article/details/8944647

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

#define ERR_EXIT(m)\
	do{\
		perror(m);\
		exit(EXIT_FAILURE);\	
	}while(0)

void handler(int sig);

int
main(int argc, char *argv[])
{
	if(signal(SIGALRM, handler) == SIG_ERR)
		ERR_EXIT("signal error");
	alarm(1);
	for(;;)
		pause();
	return 0;
}

void handler(int sig)
{
	printf("recv a sig = %d\n", sig);
	alarm(1);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程间通信是指在不同进程之间进行数据交换和同步的一种技术。Linux提供了多种进程间通信的方式,包括管道、消息队列、共享内存和信号量等。在实验六,我们将学习如何使用这些方式进行进程间通信。 1. 管道 管道是一种半双工的通信方式,它可以在两个进程之间传递数据。在Linux,管道分为匿名管道和命名管道。匿名管道只能用于父子进程之间的通信,而命名管道可以用于任意两个进程之间的通信。 使用匿名管道进行进程间通信的步骤如下: - 父进程创建管道,并调用fork函数创建子进程。 - 子进程通过管道接收数据。 - 父进程通过管道发送数据。 - 子进程接收到数据后进行处理。 使用命名管道进行进程间通信的步骤如下: - 创建命名管道。 - 打开命名管道并进行读写操作。 2. 消息队列 消息队列是一种进程间通信机制,它允许不同进程之间通过一个消息传递序列来进行通信。在Linux,每个消息都有一个类型,接收进程可以选择接收某个特定类型的消息。 使用消息队列进行进程间通信的步骤如下: - 创建消息队列。 - 发送消息到消息队列。 - 接收消息并进行处理。 3. 共享内存 共享内存是一种进程间通信的方式,它允许不同进程之间共享同一个物理内存区域。这种方式比较高效,但需要考虑进程间的同步和互斥问题,否则会出现数据不一致的情况。 使用共享内存进行进程间通信的步骤如下: - 创建共享内存区域。 - 进程通过共享内存区域进行数据交换。 - 进程需要进行同步和互斥操作。 4. 信号信号量是一种进程间同步的机制,它可以用来保证不同进程之间的共享资源在同一时刻只能被一个进程访问。在Linux,每个信号量都有一个计数器,当计数器为0时,进程需要等待;当计数器大于0时,进程可以继续执行。 使用信号量进行进程间通信的步骤如下: - 创建信号量。 - 进程信号量进行P操作(等待)。 - 进程信号量进行V操作(释放)。 总体来说,不同的进程间通信方式各有优缺点,应根据实际需求选择适合的方式。在实验六,我们将通过编写代码来学习如何使用这些方式进行进程间通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值