Difference between revisions of "Python"

From Tech
Jump to navigationJump to search
Line 1: Line 1:
  +
* [[multiprocess.Lock replacement using SYSV]]
 
<nowiki>
 
<nowiki>
 
#include <sys/types.h>
 
#include <sys/types.h>

Revision as of 01:11, 9 February 2013

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdlib.h>
#include <stdio.h>

int acquire(int semid){
  struct sembuf sops[2];
    
  sops[0].sem_num = 0; 
  sops[0].sem_op = -1; 
  sops[0].sem_flg = SEM_UNDO;
  
  
  if (semop(semid, sops, 1) == -1) {
    perror("acquire");
    exit(1);
  }
}

int release(int semid){
  struct sembuf sops[2];
    
  sops[0].sem_num = 0;        /* Operate on semaphore 0 */
  sops[0].sem_op = 1;         /* Wait for value to equal 0 */
  sops[0].sem_flg = SEM_UNDO;
  
  
  if (semop(semid, sops, 1) == -1) {
    perror("release");
    exit(1);
  }
}

void p(int semid, int i){
  int j;
  
  acquire(semid);
  for(j=0; j<10; j++){
    printf("%i\n",i);
    sleep(1);
  }
  release(semid);
}

int main(int argc, char **argv){
  key_t key;
  int semid;
  int wait_status;
  union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
				(Linux-specific) */
  };
  int v;
  union semun su;

  //key=ftok("l-.l", 0x55);
  //printf("key=%i\n",key);
  key=IPC_PRIVATE;
  semid=semget(key,  1, IPC_CREAT|0666);
  printf("semid=%i\n",semid);
  su.val=1;
  v=semctl(semid, 0, SETVAL, su);
  if(v==-1){
    perror("semctl0");
    exit(1);
  }

  v=semctl(semid, 0, GETVAL);
  if(v==-1){
    perror("semctl1");
    exit(1);
  }
  printf("val after set: v=%i\n", v);

  if(fork()){
    p(semid, 1);
    wait(&wait_status);
  } else {
    p(semid, 2);
  }
  
}