真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[Linux信號(hào)]進(jìn)程間使用信號(hào)進(jìn)行同步

/*
主進(jìn)程休眠1秒,給子進(jìn)程發(fā)送一個(gè)usr1信號(hào),子進(jìn)程接收到
usr1信號(hào)后進(jìn)入注冊(cè)信號(hào)處理函數(shù),在屏幕上輸出當(dāng)前時(shí)間。
*/
#include 
#include 
#include 
#include 
//這是USR1的信號(hào)處理函數(shù),用于在屏幕上輸出時(shí)間信息
void singalUSR1Deal(int iSig)
{
  time_t timetmp;     //定義一個(gè)時(shí)間結(jié)構(gòu)體變量
  if(iSig == SIGUSR1) //如果是用戶信號(hào)1
  {
    time(&timetmp);     //獲得當(dāng)前時(shí)間參數(shù)
    printf("%s",ctime(&timetmp));  //在屏幕上輸出當(dāng)前時(shí)間
  }
  return;
}  
//以下為主函數(shù)
int main(int argc,char *argv[])
{
  pid_t pid;                  //進(jìn)程的ID
  pid = fork();               //調(diào)用fork創(chuàng)建一個(gè)新的ID
  if(pid != 0)                //主進(jìn)程
  {
    while(1)                  //循環(huán)
    {
      sleep(1);               //休眠1秒
      if(kill(pid,SIGUSR1) == -1)  //調(diào)用kill函數(shù)向子進(jìn)程發(fā)送SIGUSR1信號(hào)
      {
         printf("向子進(jìn)程發(fā)送SIGUSR1失敗。\n");
         exit(0);            //退出
      }
    }
  }     
  else                       //子進(jìn)程
  {
    signal(SIGUSR1,singalUSR1Deal);    //注冊(cè)SIGUSR1
    while(1)
    {
    }
  }
}

成都創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、淮濱網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、成都商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為淮濱等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

/*
主進(jìn)程創(chuàng)建2個(gè)子進(jìn)程,給子進(jìn)程1每隔1秒發(fā)送一個(gè)usr1信號(hào),子進(jìn)程1接收到
usr1信號(hào)后進(jìn)入注冊(cè)信號(hào)處理函數(shù),在屏幕上輸出當(dāng)前時(shí)間;給子進(jìn)程2每隔
1秒發(fā)送一個(gè)usr2信號(hào),子進(jìn)程2接收到usr2信號(hào)后對(duì)一個(gè)在主進(jìn)程中創(chuàng)建的文
件進(jìn)行寫(xiě)入字符串操作
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//這是USR1的信號(hào)處理函數(shù),用于在屏幕上輸出時(shí)間信息

#define TRUE 0x01
#define FALSE 0x00

unsigned char flg = FALSE;     //標(biāo)志位定義

void singalUSR1Deal(int iSig)
{
  time_t timetmp;     //定義一個(gè)時(shí)間結(jié)構(gòu)體變量
  if(iSig == SIGUSR1) //如果是用戶信號(hào)1
  {
    time(&timetmp);     //獲得當(dāng)前時(shí)間參數(shù)
    printf("%s",ctime(&timetmp));  //在屏幕上輸出當(dāng)前時(shí)間
  }
  return;
}
//這是USR2的信號(hào)處理函數(shù),用于向一個(gè)文件中寫(xiě)入字符串
void singalUSR2Deal(int iSig)
{
  if(iSig == SIGUSR2)   //如果是用戶信號(hào)2
  {
    if(flg == FALSE)   //如果標(biāo)志為假
    {
      flg = TRUE;      //修改標(biāo)志位
    }
  }
}

//以下為主函數(shù)
int main(int argc,char *argv[])
{
  pid_t pid1,pid2;            //進(jìn)程的ID
  int fd;                     //文件描述符
  char writebuf[] = "this is a test!\n";   //待寫(xiě)入字符串
  int writecounter = 0;       //用于記錄寫(xiě)入的偏移量
  int temp = 0,seektemp = 0,j = 0; //都是用于計(jì)算文件偏移的臨時(shí)變量        
  if (argc != 2)              //如果參數(shù)不正確
  {
    printf("請(qǐng)輸入正確的文件參數(shù)。\n");   
    return 0;
  }
  fd = open(*(argv+1),O_RDWR|O_CREAT,S_IRWXU); //打開(kāi)或者創(chuàng)建一個(gè)文件
  pid1 = fork();              //調(diào)用fork創(chuàng)建一個(gè)新的進(jìn)程
  if(pid1 != 0)                //主進(jìn)程
  {
    pid2 = fork();             //創(chuàng)建第二個(gè)子進(jìn)程
    if(pid2 != 0)             //主進(jìn)程
    {
      while(1)                  //循環(huán)
      {
        sleep(1);               //休眠1秒
        if(kill(pid1,SIGUSR1) == -1)  //調(diào)用kill函數(shù)向子進(jìn)程1發(fā)送SIGUSR1信號(hào)
        {
           printf("向子進(jìn)程1發(fā)送SIGUSR1失敗。\n");
           exit(0);            //退出
        }
        if(kill(pid2,SIGUSR2) == -1)  //調(diào)用kill向子進(jìn)程2發(fā)送SIGUSR2信號(hào)
        {
           printf("向子進(jìn)程2發(fā)送SIGUSR2失敗。\n");
           exit(0);            //退出
        }
      }
    }
    else                       //這是子進(jìn)程2的操作
    {
      signal(SIGUSR2,singalUSR2Deal);   //注冊(cè)SIGUSR2的處理函數(shù)
      while(1)
      {
        while(flg == FALSE);          //如果標(biāo)志為假則等待
        flg = FALSE;                  //修改標(biāo)志位
        printf("這是子進(jìn)程2.\n");     //屏幕輸出提示
        if(writecounter == 0)        //第一次寫(xiě)入
        {
          temp = write(fd,writebuf,strlen(writebuf));  //寫(xiě)入數(shù)據(jù)
          seektemp = lseek(fd,0,SEEK_CUR);             //獲得當(dāng)前偏移量
          writecounter++; 
        }
        else
        {
          j = strlen(writebuf)*writecounter;
          seektemp = lseek(fd,j,SEEK_SET);
          temp = write(fd,writebuf,strlen(writebuf));
          writecounter++;
        }
      }
    }
  }
  else                       //子進(jìn)程
  {
    signal(SIGUSR1,singalUSR1Deal);    //注冊(cè)SIGUSR1的處理函數(shù)
    while(1)
    {
    }
  }
}

分享名稱:[Linux信號(hào)]進(jìn)程間使用信號(hào)進(jìn)行同步
本文來(lái)源:http://weahome.cn/article/jsdpjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部