ITKeyword,专注技术干货聚合推荐

注册 | 登录

IPC之System V 信号量(后续代码实现)

gan1007 分享于

2020腾讯云10周年活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

推荐:IPC笔记之System V信号量

1、概述:System V信号量用三个函数,semget,semop,semctl,分别是信号量集的夺取,操作,控制。其操作对象是信号量集合,semop操作的集合中,这些对象要么全

上篇概括了system V信号量基本使用, 下面自己实现的一个简单的信号量代码: #include <sys/sem.h>#include <sys/ipc.h>#include <unistd.h>#include <time.h>#include <stdio.h>union semun {

int val;

struct semid_ds *buf;

short *array;};void child1(int semid);void child2(int semid);int main(){

int ret;

pid_t pid1,pid2;

int semid1,semid2;

struct sembuf sem;

union semun sem_val;

if((semid1 = semget(IPC_PRIVATE,1,IPC_CREAT|0666)) < 0){

perror("semget semid1 error!\n");

}

if((semid2 = semget(IPC_PRIVATE,1,IPC_CREAT|0666)) < 0){

perror("semget semid2 erroe!\n");

}

sem_val.val = 0;

ret = semctl(semid1,0,SETVAL,sem_val);

if(ret < 0){

perror("semctl1 error!\n");

}

ret = semctl(semid2,0,SETVAL,sem_val);

if(ret < 0){

perror("semctl2 error!\n");

}

pid1 = fork();

if(pid1 < 0){

perror("fork pid1 error\n");

}

else if(pid1 == 0){

child1(semid1);

}

pid2 = fork();

if(pid2 < 0){

perror("fork pid2 error\n");

}

else if(pid2 == 0){

child2(semid2);

}

sem.sem_num = 0;

sem.sem_op

= 1;

sem.sem_flg = SEM_UNDO;

while(1)

推荐:linux进程间通讯-System V IPC 信号量

进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章: Linux进

{

sleep(1);

if(semop(semid1,&sem,1) == -1){

perror("semop semid1\n");

}

if(semop(semid2,&sem,1) == -1){

perror("semop semid2\n");

}

}

return 0;}void child1(int semid1){

struct sembuf sem1;

sem1.sem_num = 0;

sem1.sem_op

= -1;

sem1.sem_flg = SEM_UNDO;

while(1)

{

if(semop(semid1,&sem1,1) == -1){

perror("semop semid1\n");

}

printf("this is the child1\n");

sleep(1);

}}void child2(int semid2){

struct sembuf sem2;

sem2.sem_num = 0;

sem2.sem_op

= -5;

sem2.sem_flg = SEM_UNDO;

while(1)

{

if(semop(semid2,&sem2,1) == -1){

perror("semop semid2\n");

}

printf("this is the child2\n");

sleep(1);

}}

运行结果如下:

this is the child1

this is the child1

this is the child1

this is the child1

this is the child1

this is the child2

this is the child1

this is the child1

this is the child1

this is the child1

this is the child1

this is the child2

本文仅限学习之用,如有雷同不胜荣幸!!有误之处请指出,谢谢合作!

推荐:Linux IPC实践(11) --System V信号量(1)

信号量API #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);int semctl(int semid, int sem

上篇概括了system V信号量基本使用, 下面自己实现的一个简单的信号量代码: #include <sys/sem.h>#include <sys/ipc.h>#include <unistd.h>#include <time.h>#include <stdio.h>union s

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。