Linux下进程之间信号量互斥、同步
来源:互联网 发布:mac版qq群文件在哪 编辑:程序博客网 时间:2024/06/05 10:06
一、信号量
信号量一般的作用就是用在进程之间的互斥和同步操作,跟线程的锁机制差不多的作用。线程当然也可以使用信号量来进行互斥、同步。
二、程序示例
/*commom.h*/#ifndef _COMMOM_H_#define _COMMOM_H_#include <sys/ipc.h>#include <sys/sem.h>#include <sys/types.h>#include <unistd.h>union semun{int val;struct semid_ds *buf;unsigned short *array;};int init_sem(int semid){union semun sem;sem.val = 1;if (semctl(semid, 0, SETVAL, sem)==-1){printf("set_sem failed!\n");exit(1);}return 0;}int del_sem(int semid){union semun sem;if (semctl(semid, 0, IPC_RMID, sem)==-1){printf("del_sem failed!\n");exit(1);}return 0;}int create_sem(key_t key, int num_sems){int semid;semid = semget(key, num_sems, 0666|IPC_CREAT);if (semid == -1){printf("create_sem failed!\n");exit(1);}return semid;}int sem_p(int semid){struct sembuf sem_buf;sem_buf.sem_num = 0;sem_buf.sem_op = -1;sem_buf.sem_flg = SEM_UNDO;if (semop(semid, &sem_buf, 1)==-1){printf("sem_p failed!\n");exit(1);}return 0;}int sem_v(int semid){struct sembuf sem_buf;sem_buf.sem_num = 0;sem_buf.sem_op = +1;sem_buf.sem_flg = SEM_UNDO;if (semop(semid, &sem_buf, 1)==-1){printf("sem_p failed!\n");exit(1);}return 0;}#endif
/*sem_write1.c*/#include <stdio.h>#include <stdlib.h>#include "commom.h"int main(void){FILE *fp;key_t key;int semid;key = ftok("./commom.h", 0);printf("0x%x\n", key);semid = create_sem(key, 1);fp = fopen("./text.txt", "a+");sem_p(semid);fwrite("english\n", 8, 1, fp);sem_v(semid);sleep(5);sem_p(semid);fwrite("test\n", 5, 1, fp);sem_v(semid);sleep(5);fclose(fp);del_sem(semid);return 0;}
/*sem_write2.c*/#include <stdio.h>#include <stdlib.h>#include "commom.h"int main(void){int semid;key_t key;FILE *fp;fp = fopen("./text.txt", "a+");key = ftok("./commom.h", 0);printf("0x%x\n", key);semid = create_sem(key, 1);init_sem(semid);sem_p(semid);fwrite("hello\n", 6, 1, fp);sem_v(semid);sleep(5);sem_p(semid);fwrite("world\n", 6, 1, fp);sem_v(semid);fclose(fp);return 0;}
#makefileCFLAGS = -Wall -gCC = gccTARGET = sem_write1 sem_write2all:$(TARGET)sem_write1:sem_write1.o$(CC) $(CFLAGS) -o $@ $^sem_write2:sem_write2.o$(CC) $(CFLAGS) -o $@ $^%.o:%.c %.h$(CC) -c -o $@ $<clean:rm -f $(TARGET) *.o
注意:先运行sem_write2,因为sem_write2有对信号量进行初始化的操作,然后才能进行P/V操作。
0 0
- Linux下进程之间信号量互斥、同步
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- linux 线程互斥同步By信号量
- linux信号量---互斥与同步
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- linux互斥与同步 之 信号量 读写信号量
- linux进程之间互斥
- linux 命名信号量实现进程间的互斥与同步
- Linux系统编程——进程同步与互斥:POSIX有名信号量
- Linux系统编程——进程同步与互斥:System V 信号量
- linux 命名信号量实现进程间的互斥与同步
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- 【Linux系统编程】进程同步与互斥:System V 信号量
- Linux系统编程——进程同步与互斥:POSIX有名信号量
- Linux系统编程——进程同步与互斥:System V 信号量
- Linux下线程与进程同步与互斥
- 进程间同步与互斥---信号量P,V操作
- 进程间通信学习总结2---信号量互斥同步
- 即兴题——分别求一组数的正、负数之和
- fedora安装之后
- 软件需求
- Java线程(一):线程安全与不安全
- Android - new BitmapDrawable deprecated 创建一个空白的drawable
- Linux下进程之间信号量互斥、同步
- 赠送 HttpClient 和HttpURLConnection 的轻型网络框架 ---》按照自己的需求定制修改框架
- unity 接移动mm sdk
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别
- 读入外挂
- 有一种毒药叫成功---成功学的泛滥与迷失
- Android手机截图代码(针对root设备,可截取任意屏幕)
- warning: no rule to process file '$(PROJECT_DIR)/MyWebView/HighlightedString
- 项目计划实例