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...