前言
操作系统: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