/* 主進(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) { } } }