Linux下进程之间信号量互斥、同步
2014-12-08 11:20
363 查看
一、信号量
信号量一般的作用就是用在进程之间的互斥和同步操作,跟线程的锁机制差不多的作用。线程当然也可以使用信号量来进行互斥、同步。
二、程序示例
注意:先运行sem_write2,因为sem_write2有对信号量进行初始化的操作,然后才能进行P/V操作。
信号量一般的作用就是用在进程之间的互斥和同步操作,跟线程的锁机制差不多的作用。线程当然也可以使用信号量来进行互斥、同步。
二、程序示例
/*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; }
#makefile CFLAGS = -Wall -g CC = gcc TARGET = sem_write1 sem_write2 all:$(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操作。
相关文章推荐
- 【Linux系统编程】进程同步与互斥:System V 信号量
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- 多进程之间的互斥信号量实现(Linux和windows跨平台)
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- linux 命名信号量实现进程间的互斥与同步
- linux 多线程编程 之 信号量互斥同步
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- <转>linux操作系统编程——共享内存读写(采用信号量进行同步互斥)
- [linux系统编程]System V IPC 信号量做进程间互斥
- linux中的生产者和消费者问题--信号量 互斥 同步
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- 信号量和进程互斥、同步准则
- 信号量---解决进程间的同步与互斥问题之1
- semget函数 semopt 采用信号量处理多进程互斥同步
- linux多进程多线程互斥同步例子
- linux 多线程编程 之 信号量互斥同步
- Linux 进程与线程的同步与互斥
- Linux 进程管理剖析: Linux 同步方法剖析 内核原子,自旋锁和互斥锁
- Linux 进程管理 -------进程互斥和同步
- Linux进程同步之POSIX信号量