概述
以下代码利用mmap给内存文件分配空间,利用fork产生父子进程,通过semaphore中的信号量进行同步和死锁操作。完成了父子进程的同步运行。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/mman.h>
int* count = 0;
sem_t *mutex1 = NULL;
sem_t *mutex2 = NULL;
int finish = 0;
int main()
{
mutex1 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
mutex2 = (sem_t*)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
count = (int*)mmap(NULL,sizeof(int), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1,0);
sem_init(mutex1, 1, 1);
sem_init(mutex2, 1, 0);
*count = 0;
if(fork()==0)
{
while(1)
{
printf("child continue!n");
sem_wait(mutex1);
*count += 2;
printf("child:%dn",*count);
finish++;
sem_post(mutex2);
if(finish == 10)
break;
}
printf("child Finish!n");
exit(0);
}
while(1)
{
printf("father continue!n");
sem_wait(mutex2);
*count -= 1;
printf("father:%dn",*count);
finish++;
sem_post(mutex1);
if(finish == 10)
break;
}
sem_destroy(mutex1);
sem_destroy(mutex2);
munmap(mutex1, sizeof(sem_t));
munmap(mutex2, sizeof(sem_t));
munmap(count, sizeof(int));
printf("Finished All!n");
return 0;
}
在linux下进行编译
[root@localhost myfile]# gcc testsem.c -o testsem -lpthread
运行结果:
[root@localhost myfile]# ./testsem
father continue!
child continue!
child:2
child continue!
father:1
father continue!
child:3
child continue!
father:2
father continue!
child:4
child continue!
father:3
father continue!
child:5
child continue!
father:4
father continue!
child:6
child continue!
father:5
father continue!
child:7
child continue!
father:6
father continue!
child:8
child continue!
father:7
father continue!
child:9
child continue!
father:8
father continue!
child:10
child continue!
father:9
father continue!
child:11
child Finish!
father:10
Finished All!
最后
以上就是彩色大船为你收集整理的Linux下进程同步问题小例的全部内容,希望文章能够帮你解决Linux下进程同步问题小例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复