Difference between revisions of "Python"

From Tech
Jump to navigationJump to search
(Created page with " <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…")
 
Line 78: Line 78:
 
Process(target=fight, args=(4,)).start()
 
Process(target=fight, args=(4,)).start()
 
 
  +
</nowiki>
  +
  +
  +
<nowiki>
  +
#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;
  +
  +
key=ftok("l-.l", 0x55);
  +
printf("key=%i\n",key);
  +
semid=semget(key, 1, IPC_CREAT|0666);
  +
printf("semid=%i\n",semid);
  +
release(semid);
  +
printf("after first release");
  +
  +
printf("semid=%i\n", semid);
  +
if(fork()){
  +
p(semid, 1);
  +
wait(&wait_status);
  +
} else {
  +
p(semid, 2);
  +
}
  +
  +
}
  +
 
</nowiki>
 
</nowiki>

Revision as of 18:43, 8 February 2013

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()
    


#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;

  key=ftok("l-.l", 0x55);
  printf("key=%i\n",key);
  semid=semget(key,  1, IPC_CREAT|0666);
  printf("semid=%i\n",semid);
  release(semid);
  printf("after first release");

  printf("semid=%i\n", semid);
  if(fork()){
    p(semid, 1);
    wait(&wait_status);
  } else {
    p(semid, 2);
  }
  
}