一. 查看系统中已创建的信号量
命令: 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()
}