[Linux信号]进程间使用信号进行同步-成都快上网建站

[Linux信号]进程间使用信号进行同步

/*
主进程休眠1秒,给子进程发送一个usr1信号,子进程接收到
usr1信号后进入注册信号处理函数,在屏幕上输出当前时间。
*/
#include 
#include 
#include 
#include 
//这是USR1的信号处理函数,用于在屏幕上输出时间信息
void singalUSR1Deal(int iSig)
{
  time_t timetmp;     //定义一个时间结构体变量
  if(iSig == SIGUSR1) //如果是用户信号1
  {
    time(&timetmp);     //获得当前时间参数
    printf("%s",ctime(&timetmp));  //在屏幕上输出当前时间
  }
  return;
}  
//以下为主函数
int main(int argc,char *argv[])
{
  pid_t pid;                  //进程的ID
  pid = fork();               //调用fork创建一个新的ID
  if(pid != 0)                //主进程
  {
    while(1)                  //循环
    {
      sleep(1);               //休眠1秒
      if(kill(pid,SIGUSR1) == -1)  //调用kill函数向子进程发送SIGUSR1信号
      {
         printf("向子进程发送SIGUSR1失败。\n");
         exit(0);            //退出
      }
    }
  }     
  else                       //子进程
  {
    signal(SIGUSR1,singalUSR1Deal);    //注册SIGUSR1
    while(1)
    {
    }
  }
}

成都创新互联公司专注于企业全网营销推广、网站重做改版、淮滨网站定制设计、自适应品牌网站建设、HTML5成都商城网站开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为淮滨等各大城市提供网站开发制作服务。

/*
主进程创建2个子进程,给子进程1每隔1秒发送一个usr1信号,子进程1接收到
usr1信号后进入注册信号处理函数,在屏幕上输出当前时间;给子进程2每隔
1秒发送一个usr2信号,子进程2接收到usr2信号后对一个在主进程中创建的文
件进行写入字符串操作
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//这是USR1的信号处理函数,用于在屏幕上输出时间信息

#define TRUE 0x01
#define FALSE 0x00

unsigned char flg = FALSE;     //标志位定义

void singalUSR1Deal(int iSig)
{
  time_t timetmp;     //定义一个时间结构体变量
  if(iSig == SIGUSR1) //如果是用户信号1
  {
    time(&timetmp);     //获得当前时间参数
    printf("%s",ctime(&timetmp));  //在屏幕上输出当前时间
  }
  return;
}
//这是USR2的信号处理函数,用于向一个文件中写入字符串
void singalUSR2Deal(int iSig)
{
  if(iSig == SIGUSR2)   //如果是用户信号2
  {
    if(flg == FALSE)   //如果标志为假
    {
      flg = TRUE;      //修改标志位
    }
  }
}

//以下为主函数
int main(int argc,char *argv[])
{
  pid_t pid1,pid2;            //进程的ID
  int fd;                     //文件描述符
  char writebuf[] = "this is a test!\n";   //待写入字符串
  int writecounter = 0;       //用于记录写入的偏移量
  int temp = 0,seektemp = 0,j = 0; //都是用于计算文件偏移的临时变量        
  if (argc != 2)              //如果参数不正确
  {
    printf("请输入正确的文件参数。\n");   
    return 0;
  }
  fd = open(*(argv+1),O_RDWR|O_CREAT,S_IRWXU); //打开或者创建一个文件
  pid1 = fork();              //调用fork创建一个新的进程
  if(pid1 != 0)                //主进程
  {
    pid2 = fork();             //创建第二个子进程
    if(pid2 != 0)             //主进程
    {
      while(1)                  //循环
      {
        sleep(1);               //休眠1秒
        if(kill(pid1,SIGUSR1) == -1)  //调用kill函数向子进程1发送SIGUSR1信号
        {
           printf("向子进程1发送SIGUSR1失败。\n");
           exit(0);            //退出
        }
        if(kill(pid2,SIGUSR2) == -1)  //调用kill向子进程2发送SIGUSR2信号
        {
           printf("向子进程2发送SIGUSR2失败。\n");
           exit(0);            //退出
        }
      }
    }
    else                       //这是子进程2的操作
    {
      signal(SIGUSR2,singalUSR2Deal);   //注册SIGUSR2的处理函数
      while(1)
      {
        while(flg == FALSE);          //如果标志为假则等待
        flg = FALSE;                  //修改标志位
        printf("这是子进程2.\n");     //屏幕输出提示
        if(writecounter == 0)        //第一次写入
        {
          temp = write(fd,writebuf,strlen(writebuf));  //写入数据
          seektemp = lseek(fd,0,SEEK_CUR);             //获得当前偏移量
          writecounter++; 
        }
        else
        {
          j = strlen(writebuf)*writecounter;
          seektemp = lseek(fd,j,SEEK_SET);
          temp = write(fd,writebuf,strlen(writebuf));
          writecounter++;
        }
      }
    }
  }
  else                       //子进程
  {
    signal(SIGUSR1,singalUSR1Deal);    //注册SIGUSR1的处理函数
    while(1)
    {
    }
  }
}

分享标题:[Linux信号]进程间使用信号进行同步
文章网址:http://kswjz.com/article/jsdpjh.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流