Python: Difference between revisions

From Tech
Jump to navigationJump to search
Content deleted Content added
No edit summary
No edit summary
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
* [[multiprocess.Lock replacement using SYSV]]
* [[multiprocess.Lock replacement using SYSV]]
* [[Converting Gregorian dates to day numbers]]
<nowiki>
* [[numpy surprises]]]
#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);
}
}

</nowiki>

Latest revision as of 15:41, 11 December 2025