中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

[Linux信號]進程間使用信號進行同步

發布時間:2020-05-17 22:56:13 來源:網絡 閱讀:876 作者:銀河星君 欄目:編程語言
/*
主進程休眠1秒,給子進程發送一個usr1信號,子進程接收到
usr1信號后進入注冊信號處理函數,在屏幕上輸出當前時間。
*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
//這是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)
    {
    }
  }
}




/*
主進程創建2個子進程,給子進程1每隔1秒發送一個usr1信號,子進程1接收到
usr1信號后進入注冊信號處理函數,在屏幕上輸出當前時間;給子進程2每隔
1秒發送一個usr2信號,子進程2接收到usr2信號后對一個在主進程中創建的文
件進行寫入字符串操作
*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
//這是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)
    {
    }
  }
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

澎湖县| 左云县| 浦县| 洛扎县| 白朗县| 共和县| SHOW| 昭平县| 湘潭县| 丰镇市| 台湾省| 固始县| 肥乡县| 衡阳县| 潼关县| 马鞍山市| 会东县| 车险| 广饶县| 黑水县| 大埔区| 临西县| 运城市| 呼和浩特市| 延川县| 昌江| 金平| 阜康市| 东乌珠穆沁旗| 辛集市| 荥经县| 阿拉善左旗| 讷河市| 湟中县| 青海省| 兴宁市| 淅川县| 松阳县| 房产| 舞阳县| 临西县|