您好,登錄后才能下訂單哦!
/* 主進程休眠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) { } } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。