判断sem信号量为零_go:删除已创建的信号量(消息队列)

9620f39c4393793eb41be6b15e581fb3.png

一. 查看系统中已创建的信号量

命令: ipcs -s

sdc@sdc-vm:~/product/linux-ipc/build$ ipcs -s
​
--------- 信号量数组 -----------
键        semid      拥有者  权限     nsems     
0x01011cf6 1802240    sdc        666        1         
0x02011cf6 1835009    sdc        666        1         
0x03011cf6 1867778    sdc        666        1         
0x04011cf6 1900547    sdc        666        1         
0x05011cf6 1933316    sdc        666        1         
0x06011cf6 1966085    sdc        666        1         
0x07011cf6 1998854    sdc        666        1         
0x08011cf6 2031623    sdc        666        1         
0x09011cf6 2064392    sdc        666        1         
0x0a011cf6 2097161    sdc        666        1  

二. 删除系统中已创建的信号量

命令:ipcrm -s <semid>

sdc@sdc-vm:~/product/linux-ipc/build$ ipcrm -s 1802240
sdc@sdc-vm:~/product/linux-ipc/build$ ipcs -s
​
--------- 信号量数组 -----------
键        semid      拥有者  权限     nsems     
0x02011cf6 1835009    sdc        666        1         
0x03011cf6 1867778    sdc        666        1         
0x04011cf6 1900547    sdc        666        1         
0x05011cf6 1933316    sdc        666        1         
0x06011cf6 1966085    sdc        666        1         
0x07011cf6 1998854    sdc        666        1         
0x08011cf6 2031623    sdc        666        1         
0x09011cf6 2064392    sdc        666        1         
0x0a011cf6 2097161    sdc        666        1 

三. go 程序删除信号量

package main
​
import "fmt"
import "os/exec"
import "bufio"
import "strings"
​
//信号量和消息队列对应的 ipcs、ipcrm 命令参数
var ipcCmdPara = map[string]string {
    "sem":"-s",
    "msq":"-q",
}
​
//获取系统中的信号量或消息队列 id
func getIpcIDs(para string) []string {
    cmd := exec.Command("ipcs", para)
    stdout, err := cmd.StdoutPipe()
    if nil != err {
        fmt.Println("cmd stdout pipe failed")
    }
​
    err = cmd.Start()
    if nil != err {
        fmt.Println("cmd start failed")
    }
​
    var ids []string
    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        line := scanner.Text()
        if strings.Contains(line, "sdc") {  //根据 “拥有者” 判断是否是有效数据
            ids = append(ids, strings.Split(line, " ")[1])
        }
    }
​
    cmd.Wait()
​
    return ids
}
​
//根据 id 删除信号量或消息队列
func removeIpc(ids []string, para string) {
    for _, id := range(ids) {
        cmd := exec.Command("ipcrm", para, id)
        cmd.Start()
        cmd.Wait()
    }
}
​
//删除信号量
func delSem() {
    fmt.Println("semaphore id:")
    semIds := getIpcIDs(ipcCmdPara["sem"])
    fmt.Println(semIds)
    removeIpc(semIds, ipcCmdPara["sem"])
}
​
//删除消息队列
func delMsq() {
    fmt.Println("message queue id:")
    msqIds := getIpcIDs(ipcCmdPara["msq"])
    fmt.Println(msqIds)
    removeIpc(msqIds, ipcCmdPara["msq"])
}
​
func main() {
    delSem()
    delMsq()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值