Go語言學習之signal(二)

2021-08-03 07:41:19 字數 2924 閱讀 5712

package main

import (

"bytes"

"errors"

"fmt"

"io"

"os"

"os/exec"

"os/signal"

"runtime/debug"

"strconv"

"strings"

"sync"

"syscall"

"time"

)func main() ()

handlesignal()

}func handlesignal()

fmt.printf("set notfication for %s...[sigrecv1]\n", sigs1)

signal.notify(sigrecv1, sigs1...)

sigrecv2 := make(chan os.signal,1)

sigs2 := os.signal

fmt.printf("set notification for %s...[sigrecv2]\n", sigs2)

signal.notify(sigrecv2, sigs2...)

/* sync,waitgroup型別值wg的add方法。新增了乙個型別值為2的差量,然後在每段併發程式後面,

分別呼叫了wg的done方法,該發放可以視為使差量減1, 在最後,還應該呼叫wg的wait方法,該方法

會一直阻塞, 知道差量變為0

*/var wg sync.waitgroup

wg.add(2)

gofunc()

fmt.printf("end. [sigrecv1]\n")

wg.done()

}()go

func()

fmt.printf("end. [sigrecv2]\n")

wg.done()

}()fmt.println("wait for 2 seconds... ")

time.sleep(2 * time.second)

fmt.printf("stop notification...")

signal.stop(sigrecv1)

close(sigrecv1)

fmt.printf("done. [sigrecv1]\n")

wg.wait()

}func sendsignal()

}()cmds := *exec.cmd"),

}output, err := runcmds(cmds)

if err != nil

pids, err := getpids(output)

if err != nil

fmt.printf("target pid(s):\n%v\n", pids)

for _, pid := range pids

sig := syscall.sigquit

fmt.printf("send signal '%s' to the process (pid=%d)...\n", sig, pid)

err = proc.signal(sig)

if err != nil

}}func getpids(strs string) (int, error)

}return pids, nil

}func runcmds(cmds *exec.cmd) (string, error)

first := true

var output byte

var err error

for _, cmd := range cmds

var stdoutbuf bytes.buffer

cmd.stdout = &stdoutbuf

if err = cmd.start(); err != nil

if err = cmd.wait(); err != nil

output = stdoutbuf.bytes()

fmt.printf("output: \n%s\n", string(output))

if first

}var lines string

var outputbuf bytes.buffer

outputbuf.write(output)

for else }}

return lines, nil

}func getcmdplaintext(cmd *exec.cmd) string

return buf.string()

}func geterror(err error, cmd *exec.cmd, extrainfo ...string) error else

iflen(extrainfo) >0

return errors.new(errmsg)

}

**包os/signal中notify函式用來當作業系統向當前程序傳送指定訊號時發出通知

func notify(c chan<-os.signal, sig ...os

.signal)

其中第乙個引數是通道型別的,該引數的型別的chan<-os.signal,這表示引數c是乙個傳送通道,在notify函式中,只能向它傳送os.signal型別的值(以下簡稱訊號值),而不能從中接收訊號值。signal.notify函式會把當前程序中接收到的指定訊號放入引數c代表的通道型別值中,這樣該函式的呼叫方就可以從這個signal接收通道中按順序獲取作業系統發來的訊號並進行相應的處理。

第二個引數是可變長的引數,這意味著我們在呼叫signal.notify函式時,可以在第乙個引數值之後再附加任意個os.signal型別的值,os/signal包中的程式會把它封裝成syscall.signal型別的值並放入到signal接收通道中。

go語言學習 二

go語言裡和c語言一樣也有指標的概念 var i int 1 var pint int i 輸出 i 1 pint 0xf8400371b0 pint 1 fmt.printf i d tpint p t pint d n i,pint,pint pint 2 輸出 i 2 pint 0xf8400...

GO語言學習二(基礎)

一 包 每個 go 程式都是由包組成的。程式執行的入口是包main 二 匯入 兩種方式 多個 import import fmt import math 用圓括號組合了匯入,打包匯入 import fmt math 三 函式 函式可以沒有引數或接受多個引數 當兩個或多個連續的函式命名引數是同一型別,...

Go語言學習 二 常量

package main import fmt 1定義常量的關鍵字const const pi float64 3.14159265358979323846 const zero 0.0 無型別負點常量 const size int64 1024 eof 1 無型別整形常量 const u,v fl...