1
0
mirror of https://github.com/hslam/sem.git synced 2025-04-25 13:48:52 +08:00
2021-01-17 02:51:44 +08:00
2020-11-28 19:17:58 +08:00
2021-01-17 02:51:44 +08:00
2021-01-17 02:51:44 +08:00
2020-11-28 19:19:47 +08:00
2020-12-18 13:07:38 +08:00
2020-11-28 21:58:30 +08:00
2020-11-28 21:58:30 +08:00
2020-11-30 17:57:40 +08:00
2020-12-01 18:59:37 +08:00
2020-11-29 04:00:27 +08:00

sem

PkgGoDev Build Status Go Report Card LICENSE

Package sem provides a way to use System V semaphores.

Get started

Install

go get github.com/hslam/sem

Import

import "github.com/hslam/sem"

Usage

Example

package main

import (
	"fmt"
	"github.com/hslam/ftok"
	"github.com/hslam/sem"
	"time"
)

func main() {
	key, err := ftok.Ftok("/tmp", 0x22)
	if err != nil {
		panic(err)
	}
	nsems := 1
	semid, err := sem.Get(key, nsems, 0666)
	if err != nil {
		semid, err = sem.Get(key, nsems, sem.IPC_CREAT|sem.IPC_EXCL|0666)
		if err != nil {
			panic(err)
		}
		defer sem.Remove(semid)
		for semnum := 0; semnum < nsems; semnum++ {
			_, err := sem.SetValue(semid, semnum, 1)
			if err != nil {
				panic(err)
			}
		}
	}
	semnum := 0
	if count, err := sem.GetValue(semid, semnum); err != nil {
		panic(err)
	} else if count == 0 {
		fmt.Printf("%s semnum %d wait\n", time.Now().Format("15:04:05"), semnum)
	}
	ok, err := sem.P(semid, semnum, sem.SEM_UNDO)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%s semnum %d P %t\n", time.Now().Format("15:04:05"), semnum, ok)
	time.Sleep(time.Second * 10)
	ok, err = sem.V(semid, semnum, sem.SEM_UNDO)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%s semnum %d V %t\n", time.Now().Format("15:04:05"), semnum, ok)
	time.Sleep(time.Second * 20)
}

Output

$ go run main.go
12:35:21 semnum 0 P true
12:35:31 semnum 0 V true

In another terminal.

$ go run main.go
12:35:25 semnum 0 wait
12:35:31 semnum 0 P true
12:35:41 semnum 0 V true

License

This package is licensed under a MIT license (Copyright (c) 2020 Meng Huang)

Author

sem was written by Meng Huang.

Description
No description provided
Readme MIT 43 KiB
Languages
Go 100%