温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-05-17 22:56:13 来源:网络 阅读:891 作者:银河星君 栏目:编程语言
/* 主进程休眠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