要求:
写2个程序,
程序a负责在内存里找bash,并把找到的bash,的PID转成int型的数据,到送给另一个进程,
程序b,接收数据,把这个PID关闭掉
数据传输用FIFO
进程同步用 信号
程序a :t1.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define FIFO_PATH "/root/fifofile.txt"
int fd;
/*根据运行的文件找到pid号码*/
int findPid(char *name)
{
char buf[100];
sprintf(buf, "ps -A | grep %s", name);//把找到的写道缓存区
FILE *fp = popen(buf, "r");//把缓存区写入文件中
if (fgets(buf, sizeof(buf), fp) != NULL)
{
pclose(fp);
return atoi(buf); /* 找到则返回PID*/
}
pclose(fp);
return 0; /* 如果找不到,则返回0*/
}
/*收到SIGUSR2信号处理函数*/
void sendPid(int signo)
{
pid_t pid = findPid("bash");
/*写入FIFO*/
write(fd, &pid, sizeof(pid_t));
/* 发信号通知对方*/
kill(findPid("t2"), SIGUSR1);
if (pid == 0)
{
close(fd);
exit(0);
}
}
int main(void)
{
fd = open(FIFO_PATH, O_WRONLY);
signal(SIGUSR2, sendPid);
raise(SIGUSR2); //kill(getpid(), SIGUSR2);//开始时给自己触发信号,触发一次。
while (1)
sleep(1);
return EXIT_SUCCESS;
}
程序 b :t2.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define FIFO_PATH "/root/fifofile.txt"
int fd;
int findPid(char *name)
{
char buf[100];
sprintf(buf, "ps -A | grep %s", name);//根据文件名找运行的pid
FILE *fp = popen(buf, "r");
if (fgets(buf, sizeof(buf), fp) != NULL)
{
pclose(fp);
return atoi(buf); /* 找到则返回PID*/
}
pclose(fp);
return 0; /* 如果找不到,则返回0*/
}
void recvPid(int signo)
{
pid_t pid;
read(fd, &pid, sizeof(pid_t));
if(pid == 0)
{
puts("end");
close(fd);
unlink(FIFO_PATH);
exit(0);
}
kill(pid, SIGKILL);//关掉bash
sleep(1);
kill(findPid("t1"), SIGUSR2);//给t1.c回发信号
}
int main(void)
{
signal(SIGUSR1, recvPid);//若是接收t1.c发过来的信号就去读取PID
mkfifo(FIFO_PATH, 0600);//创建管道
puts("wait alarm run");
fd = open(FIFO_PATH, O_RDONLY);//打开管道
puts("FIFO connected ok");
while(1)sleep(1);//等待信号(挂起)
return EXIT_SUCCESS;
}
因为是t2.c 创建的管道,应该由t2.c先运行,t2.c一运行就在等待状态,然后t1.c 运行,t1.c一向管道文件里写入pid立即发信号给t2.c,t2.c就把bash关掉。