linux下用信号关bash系统函数-----进程间通信

要求:

写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关掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值