Difference between revisions of "Python"

From Tech
Jump to navigationJump to search
Line 1: Line 1:
<nowiki>
 
import ctypes
 
import os
 
import sys
 
 
IPC_CREAT=00001000
 
# man shm_overview
 
# for f in `find /lib/lib* -type f `; do nm -D $f|grep sem_open && echo found in library: $f; done
 
locksUsed=0
 
class Lock:
 
def __init__(self):
 
#http://www.dailyfreecode.com/code/create-shared-memory-print-id-shared-2183.aspx
 
global locksUsed
 
self.fname="/tmp/Py-Lock%4i"%locksUsed
 
 
self.libc = ctypes.cdll.LoadLibrary("/lib/libc.so.6")
 
self.librt = ctypes.cdll.LoadLibrary("/lib/librt.so.1")
 
 
f=open(self.fname,"w")
 
f.write("0")
 
f.close()
 
self.key=self.libc.ftok(fname, 0x55)
 
print "ftok returned:", self.key
 
r=self.libc.semget(self.key, 1, IPC_CREAT|0666)
 
print "semget returned: ",r
 
 
si=self.librt.sem_init(self.mem, 1, 1)
 
print "sem_init returned:", si
 
locksUsed+=1
 
 
def acquire(self):
 
self.librt.sem_wait(self.sm)
 
 
def release(self):
 
self.librt.sem_post(self.sm)
 
 
#class Lock_POSIX:
 
# def __init__(self):
 
# global locksUsed
 
# self.librt = ctypes.cdll.LoadLibrary("/lib/libpthread.so.0")
 
#
 
# try:
 
# self.librt.sem_unlink("/PyLock%4i"%locksUsed)
 
# except:
 
# pass
 
# self.sm=self.librt.sem_open("/PyLock%4i"%locksUsed, os.O_RDWR|os.O_CREAT, 0x1ff, 1)
 
# if sm==0:
 
# print "sem_open returned:", self.sm
 
# sys.exit()
 
# #si=self.librt.sem_init(self.sm, 1, 1)
 
# print "sem_init returned:", si
 
# if self.sm>=0:
 
# locksUsed+=1
 
#
 
# def acquire(self):
 
# self.librt.sem_wait(self.sm)
 
#
 
# def release(self):
 
# self.librt.sem_post(self.sm)
 
 
if __name__== "__main__":
 
import time
 
import random
 
from multiprocessing import Process
 
l=Lock()
 
def fight(i):
 
for j in range(10):
 
l.acquire()
 
for k in range(10):
 
print i
 
time.sleep(random.random()/30.)
 
print
 
l.release()
 
 
Process(target=fight, args=(1,)).start()
 
Process(target=fight, args=(2,)).start()
 
Process(target=fight, args=(3,)).start()
 
Process(target=fight, args=(4,)).start()
 
 
</nowiki>
 
 
 
 
<nowiki>
 
<nowiki>
 
#include <sys/types.h>
 
#include <sys/types.h>
Line 131: Line 49:
 
int semid;
 
int semid;
 
int wait_status;
 
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);
+
//key=ftok("l-.l", 0x55);
printf("key=%i\n",key);
+
//printf("key=%i\n",key);
  +
key=IPC_PRIVATE;
 
semid=semget(key, 1, IPC_CREAT|0666);
 
semid=semget(key, 1, IPC_CREAT|0666);
 
printf("semid=%i\n",semid);
 
printf("semid=%i\n",semid);
  +
su.val=1;
release(semid);
 
  +
v=semctl(semid, 0, SETVAL, su);
printf("after first release");
 
  +
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);
   
printf("semid=%i\n", semid);
 
 
if(fork()){
 
if(fork()){
 
p(semid, 1);
 
p(semid, 1);

Revision as of 19:11, 8 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);
  }
  
}