Linux _sem 信号量 V_P
2016-04-01 12:58
851 查看
main1.c
main2.c
#include <stdlib.h> #include <stdio.h> int main(void) { int i; for (i=0; i<5; i++) { /* ƒ£ƒ‚¡ŸΩÁ«¯----begin */ printf("Process(%d) In\n", getpid()); sleep(1); printf("Process(%d) Out\n", getpid()); /* ƒ£ƒ‚¡ŸΩÁ«¯----end */ sleep(1); } return 0; }
main2.c
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <stdlib.h> #include <stdio.h> #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED) #else union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; #endif static sem_initial(int semid) { int ret; union semun semun; semun.val = 1; ret = semctl(semid, 0, SETVAL, semun); if (ret == -1) { fprintf(stderr, "semctl failed!\n"); } return ret; } static int sem_p(int semid) { int ret; struct sembuf sembuf; sembuf.sem_op = -1; sembuf.sem_num = 0; sembuf.sem_flg = SEM_UNDO; ret = semop(semid, &sembuf, 1); if (ret == -1) { fprintf(stderr, "sem_p failed!\n"); } return ret; } static int sem_v(int semid) { int ret; struct sembuf sembuf; sembuf.sem_op = 1; sembuf.sem_num = 0; sembuf.sem_flg = SEM_UNDO; ret = semop(semid, &sembuf, 1); if (ret == -1) { fprintf(stderr, "sem_v failed!\n"); } return ret; } int main(int argc, char* argv[]) { int i; int ret; int semid; /* ªÒ»°–≈∫≈¡ø */ semid = semget((key_t)1234, 1, 0666 | IPC_CREAT); if (semid == -1) { printf("semget failed!\n"); exit(1); } /* ≥ı ºªØ–≈∫≈¡ø */ if (argc > 1) { ret = sem_initial(semid); if (ret == -1) { exit(1); } } for (i=0; i<5; i++) { if (sem_p(semid) == -1) { exit(1); } /* ƒ£ƒ‚¡ŸΩÁ«¯----begin */ printf("Process(%d) In\n", getpid()); sleep(1); printf("Process(%d) Out\n", getpid()); /* ƒ£ƒ‚¡ŸΩÁ«¯----end */ if (sem_v(semid) == -1) { exit(1); } sleep(1); } /* …æ≥˝–≈∫≈¡ø */ return 0; }
相关文章推荐
- Linux _sem 信号量 V_P
- Linux _msg 消息队列 demo
- Linux基本常识积累
- Linux_ msg 消息队列
- Linux _share 内存共享 demo
- Linux _ share 内存共享
- Linux_ select demo
- Linux系统监控脚本实战
- Linux_ select 多路复用
- linux下程序调试使用文件重定向
- 转 linux c多线程
- CentOS7安装iptables防火墙
- centos rpm安装zabbix
- CentOS 6.3下配置LVM(逻辑卷管理)
- Ubuntu下安装arm-linux-gnueabi-xxx编译器
- linux下svn用法
- ARM嵌入式Linux设备树简介及应用示例
- centos系统下jenkins安装与配置
- linux 下 jrtplib+jthread 交叉编译
- GEEK学习笔记— —Linux中fork()函数