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

/*

主进程休眠1秒,给子进程发送一个usr1信号,子进程接收到

usr1信号后进入注册信号处理函数,在屏幕上输出当前时间。

*/

#include 

#include 

#include 

#include 

//这是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 

#include 

#include 

#include 

#include 

#include 

#include 

//这是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)

{

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值