- 论坛徽章:
- 0
|
2个进程同时读写一个文件会产生冲突
我想利用信号量来控制
我设想的步骤:
1.create一个信号量
2.P操作
3.读写文件
4.V操作
我临时网络上找的一些信号量的知识,没怎么看明白
希望哪位前辈能抽时间点拨下
能否给个伪代码
先谢谢了!
我使用的系统是:Linux test237 2.6.9-55.ELsmp #1 SMP Fri Apr 20 16:36:54 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux
参考 unix网络编程:卷2 255页的程序,锁的功能已经实现了,但是遇到2个问题不明白
1. 该行代码有疑惑 if(arg.buf->sem_otime != 0) //这里sem_otime == 0(按书上说的如果该值不为0,表示创建该信号灯的进程已对它初始化,继续为0的情况很罕见..)
2:/tmp/sem 文件是我手动创建的..这样对吗?
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <errno.h>
- #include <semaphore.h>
- #define LOCK_PATH "/tmp/sem"
- #define MAX_TRIES 10
- #define repline() do{ printf("%d", __LINE__); fflush(stdout); }while(0)
- union semun {
- int val;
- struct semid_ds *buf;
- unsigned short *array;
- };
- int semid, initflag;
- struct sembuf postop, waitop;
- int
- my_lock(void)
- {
- int oflag, i;
- key_t semkey;
- union semun arg;
- struct semid_ds seminfo;
- if(initflag == 0) {
- if( (semkey = ftok(LOCK_PATH, 0)) == -1) {
- repline();
- perror("[ftok]");
- return -1;
- }
-
- oflag = IPC_CREAT | IPC_EXCL | 0777;
- if( (semid = semget(semkey, 1, oflag)) >=0) {
- arg.val = 1;
- if(semctl(semid, 0, SETVAL, arg) < 0) {
- repline();
- perror("[semctl]");
- }
- } else if(errno == EEXIST) {
- if( (semid = semget(semkey, 1, 0777)) < 0) {
- repline();
- perror("[semget]");
- return -1;
- }
- arg.buf = &seminfo;
- for(i = 0; i < MAX_TRIES; i++) {
- if(semctl(semid, 0, IPC_STAT, arg) < 0) {
- repline();
- perror("[semctl]");
- return -1;
- }
- if(arg.buf->sem_otime != 0) //这里sem_otime == 0
- goto init;
- sleep(1);
- }
- repline();
- printf("time out\n");
- return -1;
- } else
- repline();
- return -1;
- init:
- initflag = 1;
- postop.sem_num = 0;
- postop.sem_op = 1;
- postop.sem_flg = SEM_UNDO;
- waitop.sem_num = 0;
- waitop.sem_op = -1;
- waitop.sem_flg = SEM_UNDO;
- }
- if( semop(semid, &waitop, 1) < 0) {
- repline();
- perror("[semop]");
- return -1;
- }
- return 0;
- }
- int
- my_unlock(void)
- {
- if( semop(semid, &postop, 1) < 0) {
- repline();
- perror("[semop]");
- return -1;
- }
- return 0;
- }
- int
- main()
- {
- my_lock();
- /*读写文件*/
- my_unlock();
- return 0;
- }
复制代码
[ 本帖最后由 车太咸 于 2007-11-23 15:10 编辑 ] |
|