Linux编程基础之A发送信号给B,B打印输出一条信息

前言

操作系统:Fedora
要求:编写程序实现如下功能:程序A.c按照用户输入的参数定时向程序B.c发送信号,B.c程序接收到该信号后,打印输出一条信息。运行过程如下:

./B value& //此时,输出进程B的PID号,value表示要输出的参数。
./A process BPID timer Val //第一个参数表示进程B的PID,第二个参数为定时时间。

本文为作者班级作业,同班同学参考借鉴的话,别直接拿本文的截图和代码交差啊 : )

代码

A.c 文件代码如下

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
#include <math.h>
int change(char *ch){  //字符串转成整数,如字符串123转成整数123
	int length=0,num=0;
	while(ch[length]!='\0'){
		length++;
	}
	for(int i=0;i<length;i++){
		int a=ch[i]-48;
		num+=a*pow(10,length-1-i);
	}
	return num;
}
int main(int argc,char *argv[]){
	int pid=change(argv[1]);
	int time=change(argv[2]);
	printf("A: %d秒后发送信号给B\n...\n",time);
	sleep(time);
	printf("A: 发送信号给B\n");
	kill(pid,SIGALRM);//发送信号给B
	return 0;
}

B.c 文件代码如下

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
char *st[10];
int s;
void sigHandler(int signalNum){
	printf("B: ");
	for(int i=1;i<s;i++) printf("%s ",st[i]);
	printf("\n");
}
int main(int argc,char *argv[]){
	s=argc;
	for(int i=1;i<=argc;i++)
		st[i]=argv[i];
	signal(SIGALRM,sigHandler);
	while(1) sleep(1);
	return 0;
}

编译执行

编译两个文件,注意 A.c 文件的编译,如果用了<math.c>文件里的函数,要加上 -lm (告诉编译器链接数学库),没加会报错
在这里插入图片描述
执行程序B

./B I get it&

每次 ./A process BPID timer Val ,都会在给定时间过后,发送信号给B,B 收到信号后,打印输出value
在这里插入图片描述
结束进程 B
在这里插入图片描述

代码解释

kill() 函数

发送一个信号 SIGALRM 给进程 PID 号为 pid 的进程

kill(pid,SIGALRM);

signal() 函数

信息处理函数,当 B 进程收到信号 SIGALRM 后,执行 sigHandle() 函数

signal(SIGALRM,sigHandler);

main() 函数

argc 的值为传入参数的个数再加上1,argv[ ] 为指针数组,大小为 argc,其中 argv[0] 指向的数组为:内容为 ./A.out (或者 ./B.out) 的字符数组,其余指针指向内容为传入的参数(以字符数组形式接收)

int main(int argc,char *argv[]);

注意事项

gcc 编译时,如果用了<math.c>文件里的函数( 例如:pow()函数 ),要加上 -lm ,告诉编译器链接数学库

gcc ... -lm
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

huazi-J

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

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

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

打赏作者

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

抵扣说明:

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

余额充值