婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang標準庫syscall詳解(什么是系統調用)

Golang標準庫syscall詳解(什么是系統調用)

熱門標簽:揚州電銷外呼系統軟件 百度地圖標注位置網站 武漢百應人工智能電銷機器人 電腦外呼系統輻射大嗎 上海企業外呼系統排名 智能語音電銷的機器人 開通400電話申請流程 如何利用高德地圖標注家 400手機電話免費辦理

一、什么是系統調用

In computing, a system call is the programmatic way in which a computer program requests a service from the kernel of the operating system it is executed on. This may include hardware-related services (for example, accessing a hard disk drive), creation and execution of new processes, and communication with integral kernel services such as process scheduling. System calls provide an essential interface between a process and the operating system.

系統調用是程序向操作系統內核請求服務的過程,通常包含硬件相關的服務(例如訪問硬盤),創建新進程等。系統調用提供了一個進程和操作系統之間的接口。

二、Golang標準庫-syscall

syscall包包含一個指向底層操作系統原語的接口。

注意:該軟件包已被鎖定。標準以外的代碼應該被遷移到golang.org/x/sys存儲庫中使用相應的軟件包。這也是應用新系統或版本所需更新的地方。 Signal , Errno 和 SysProcAttr 在 golang.org/x/sys 中尚不可用,并且仍然必須從 syscall 程序包中引用。有關更多信息,請參見 https://golang.org/s/go1.4-syscall。

https://pkg.go.dev/golang.org/x/sys
該存儲庫包含用于與操作系統進行低級交互的補充Go軟件包。

1. syscall無處不在

舉個最常用的例子, fmt.Println(“hello world”), 這里就用到了系統調用 write, 我們翻一下源碼。

func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}
Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
 
func (f *File) write(b []byte) (n int, err error) {
    if len(b) == 0 {
        return 0, nil
    }
    // 實際的write方法,就是調用syscall.Write()
    return fixCount(syscall.Write(f.fd, b))
}

2. syscall demo舉例:

 go版本的strace Strace

strace 是用于查看進程系統調用的工具, 一般使用方法如下:

strace -c 用于統計各個系統調用的次數

[root@localhost ~]# strace -c echo hello
hello
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         1           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0         3           open
  0.00    0.000000           0         5           close
  0.00    0.000000           0         4           fstat
  0.00    0.000000           0         9           mmap
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         2           munmap
  0.00    0.000000           0         4           brk
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                    36         1 total
[root@localhost ~]#

stace 的實現原理是系統調用 ptrace, 我們來看下 ptrace 是什么。

man page 描述如下:

The ptrace() system call provides a means by which one process (the “tracer”) may observe and control the execution of another process (the “tracee”), and examine and change the tracee's memory and registers. It is primarily used to implement breakpoint debuggingand system call tracing.

簡單來說有三大能力:

追蹤系統調用
讀寫內存和寄存器
向被追蹤程序傳遞信號

ptrace接口:

int ptrace(int request, pid_t pid, caddr_t addr, int data);
 
request包含:
PTRACE_ATTACH
PTRACE_SYSCALL
PTRACE_PEEKTEXT, PTRACE_PEEKDATA
等

tracer 使用 PTRACE_ATTACH 命令,指定需要追蹤的PID。緊接著調用 PTRACE_SYSCALL。
tracee 會一直運行,直到遇到系統調用,內核會停止執行。 此時,tracer 會收到 SIGTRAP 信號,tracer 就可以打印內存和寄存器中的信息了。

接著,tracer 繼續調用 PTRACE_SYSCALL, tracee 繼續執行,直到 tracee退出當前的系統調用。
需要注意的是,這里在進入syscall和退出syscall時,tracer都會察覺。

go版本的strace

了解以上內容后,presenter 現場實現了一個go版本的strace, 需要在 linux amd64 環境編譯。
https://github.com/silentred/gosys

// strace.go

package main
 
import (
    "fmt"
    "os"
    "os/exec"
    "syscall"
)
 
func main() {
    var err error
    var regs syscall.PtraceRegs
    var ss syscallCounter
    ss = ss.init()
 
    fmt.Println("Run: ", os.Args[1:])
 
    cmd := exec.Command(os.Args[1], os.Args[2:]...)
    cmd.Stderr = os.Stderr
    cmd.Stdout = os.Stdout
    cmd.Stdin = os.Stdin
    cmd.SysProcAttr = syscall.SysProcAttr{
        Ptrace: true,
    }
 
    cmd.Start()
    err = cmd.Wait()
    if err != nil {
        fmt.Printf("Wait err %v \n", err)
    }
 
    pid := cmd.Process.Pid
    exit := true
 
    for {
        // 記得 PTRACE_SYSCALL 會在進入和退出syscall時使 tracee 暫停,所以這里用一個變量控制,RAX的內容只打印一遍
        if exit {
            err = syscall.PtraceGetRegs(pid, regs)
            if err != nil {
                break
            }
            //fmt.Printf("%#v \n",regs)
            name := ss.getName(regs.Orig_rax)
            fmt.Printf("name: %s, id: %d \n", name, regs.Orig_rax)
            ss.inc(regs.Orig_rax)
        }
        // 上面Ptrace有提到的一個request命令
        err = syscall.PtraceSyscall(pid, 0)
        if err != nil {
            panic(err)
        }
        // 猜測是等待進程進入下一個stop,這里如果不等待,那么會打印大量重復的調用函數名
        _, err = syscall.Wait4(pid, nil, 0, nil)
        if err != nil {
            panic(err)
        }
 
        exit = !exit
    }
 
    ss.print()
}

// 用于統計信息的counter, syscallcounter.go

package main
 
import (
    "fmt"
    "os"
    "text/tabwriter"
 
    "github.com/seccomp/libseccomp-golang"
)
 
type syscallCounter []int
 
const maxSyscalls = 303
 
func (s syscallCounter) init() syscallCounter {
    s = make(syscallCounter, maxSyscalls)
    return s
}
 
func (s syscallCounter) inc(syscallID uint64) error {
    if syscallID > maxSyscalls {
        return fmt.Errorf("invalid syscall ID (%x)", syscallID)
    }
 
    s[syscallID]++
    return nil
}
 
func (s syscallCounter) print() {
    w := tabwriter.NewWriter(os.Stdout, 0, 0, 8, ' ', tabwriter.AlignRight|tabwriter.Debug)
    for k, v := range s {
        if v > 0 {
            name, _ := seccomp.ScmpSyscall(k).GetName()
            fmt.Fprintf(w, "%d\t%s\n", v, name)
        }
    }
    w.Flush()
}
 
func (s syscallCounter) getName(syscallID uint64) string {
    name, _ := seccomp.ScmpSyscall(syscallID).GetName()
    return name
}

最后結果:

Run:  [echo hello]
Wait err stop signal: trace/breakpoint trap
name: execve, id: 59
name: brk, id: 12
name: access, id: 21
name: mmap, id: 9
name: access, id: 21
name: open, id: 2
name: fstat, id: 5
name: mmap, id: 9
name: close, id: 3
name: access, id: 21
name: open, id: 2
name: read, id: 0
name: fstat, id: 5
name: mmap, id: 9
name: mprotect, id: 10
name: mmap, id: 9
name: mmap, id: 9
name: close, id: 3
name: mmap, id: 9
name: arch_prctl, id: 158
name: mprotect, id: 10
name: mprotect, id: 10
name: mprotect, id: 10
name: munmap, id: 11
name: brk, id: 12
name: brk, id: 12
name: open, id: 2
name: fstat, id: 5
name: mmap, id: 9
name: close, id: 3
name: fstat, id: 5
hello
name: write, id: 1
name: close, id: 3
name: close, id: 3
        1|read
        1|write
        3|open
        5|close
        4|fstat
        7|mmap
        4|mprotect
        1|munmap
        3|brk
        3|access
        1|execve
        1|arch_prctl

三、參考

Golang標準庫——syscall
參考URL: https://www.jianshu.com/p/44109d5e045b
Golang 與系統調用
參考URL: https://blog.csdn.net/weixin_33744141/article/details/89033990

以上就是Golang標準庫syscall詳解(什么是系統調用)的詳細內容,更多關于Golang標準庫syscall的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 解決Golang 中使用WaitGroup的那點坑
  • 在golang中使用Sync.WaitGroup解決等待的問題
  • Golang中的sync包的WaitGroup操作
  • Golang中的sync.WaitGroup用法實例
  • Golang的os標準庫中常用函數的整理介紹
  • Golang 標準庫 tips之waitgroup詳解

標簽:宜賓 江西 張掖 黑龍江 延邊 嘉峪關 武漢 新余

巨人網絡通訊聲明:本文標題《Golang標準庫syscall詳解(什么是系統調用)》,本文關鍵詞  Golang,標準,庫,syscall,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang標準庫syscall詳解(什么是系統調用)》相關的同類信息!
  • 本頁收集關于Golang標準庫syscall詳解(什么是系統調用)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    在线观看免费视频综合| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久视频一区二区| 3751色影院一区二区三区| 欧美三级韩国三级日本一级| 色综合久久天天| 欧美私人免费视频| 91精品午夜视频| 日韩精品自拍偷拍| 国产亚洲人成网站| 国产精品毛片久久久久久| 亚洲视频一二区| 一区二区三区不卡在线观看| 亚洲成人一二三| 麻豆一区二区三| 国产麻豆午夜三级精品| 成人成人成人在线视频| 在线影视一区二区三区| 69堂精品视频| 国产喷白浆一区二区三区| 自拍偷拍亚洲综合| 日韩国产高清在线| 福利一区二区在线| 色美美综合视频| 精品剧情在线观看| 亚洲男人的天堂在线观看| 亚洲图片一区二区| 国产乱子轮精品视频| 色婷婷综合久久久中文字幕| 欧美一区二区三区的| 亚洲国产精品av| 性做久久久久久免费观看欧美| 狠狠色丁香久久婷婷综合_中 | 欧美日韩一级黄| 2欧美一区二区三区在线观看视频| 国产精品超碰97尤物18| 人人爽香蕉精品| 99久久久久免费精品国产| 91麻豆精品国产| 亚洲日本va午夜在线影院| 韩国三级中文字幕hd久久精品| 99免费精品视频| 精品国内二区三区| 亚洲1区2区3区视频| 99久久综合色| 久久久不卡网国产精品一区| 午夜视频在线观看一区二区 | 亚洲免费电影在线| 国模大尺度一区二区三区| 91国产丝袜在线播放| 国产欧美日韩在线| 精品一区免费av| 欧美日本高清视频在线观看| 国产精品沙发午睡系列990531| 免费精品99久久国产综合精品| 日本精品视频一区二区三区| 国产精品人成在线观看免费| 精品一区二区三区的国产在线播放| 欧美性大战久久久久久久蜜臀| 亚洲欧洲精品一区二区精品久久久| 免费一级欧美片在线观看| 欧美三级日韩在线| 亚洲影视资源网| 欧美自拍偷拍一区| 亚洲日本中文字幕区| av在线播放成人| 亚洲视频在线观看一区| 97超碰欧美中文字幕| 亚洲欧洲日韩综合一区二区| 国产 日韩 欧美大片| 国产肉丝袜一区二区| 国产一区二区精品在线观看| 亚洲精品一区二区三区四区高清| 日韩1区2区日韩1区2区| 欧美一卡二卡三卡| 另类人妖一区二区av| 2017欧美狠狠色| 国产99久久久国产精品潘金网站| 国产欧美日韩久久| 99re这里只有精品首页| 一区二区三区高清| 7777精品伊人久久久大香线蕉完整版| 亚洲国产精品一区二区尤物区| 欧美色图免费看| 日韩中文字幕不卡| 国产日韩av一区二区| 99国内精品久久| 午夜精品福利在线| 精品国产一区a| 99综合电影在线视频| 亚洲不卡av一区二区三区| 91精品国产色综合久久不卡电影| 极品少妇xxxx精品少妇偷拍| 国产精品久久网站| 91国产福利在线| 久久99国内精品| 国产精品国产三级国产普通话蜜臀| 色天使色偷偷av一区二区| 热久久国产精品| 国产精品日韩成人| 日韩一区二区三区视频在线| 成人综合婷婷国产精品久久| 亚洲一区二区欧美激情| 精品成人在线观看| 91免费视频观看| 蜜桃av一区二区| 亚洲欧美偷拍另类a∨色屁股| 欧美精品第一页| 成人免费看黄yyy456| 日韩av午夜在线观看| 国产精品久久久久精k8| 在线综合+亚洲+欧美中文字幕| 国产成人av电影| 蜜臀av国产精品久久久久 | 欧美日韩你懂得| 国产高清亚洲一区| 日本伊人色综合网| 亚洲精品菠萝久久久久久久| 久久久久久久久久久久久久久99| 91电影在线观看| 高清不卡在线观看av| 麻豆精品一区二区三区| 亚洲国产综合视频在线观看| 国产人成一区二区三区影院| 日韩三级av在线播放| 欧美性xxxxxxxx| 色综合久久久久综合99| 国产一区二区不卡老阿姨| 日韩精品亚洲一区| 亚洲电影一区二区| 一区二区三区在线视频观看58| 国产日韩欧美制服另类| 精品国产百合女同互慰| 制服丝袜亚洲播放| 欧美日韩一二三区| 欧美日韩一卡二卡三卡| 精品视频一区二区不卡| 在线视频欧美精品| 日本道精品一区二区三区| 99久久综合国产精品| 国产成人精品免费在线| 国产一区二区精品久久99| 激情图片小说一区| 国产一区二区毛片| 国产精品一区久久久久| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产精品国产馆在线真实露脸 | 91啪九色porn原创视频在线观看| 国产一区欧美日韩| 国产剧情一区二区| 岛国精品一区二区| 99久久久精品| 一本大道久久a久久综合| 在线一区二区视频| 欧美一区欧美二区| 精品国产免费久久| 久久精品欧美一区二区三区不卡| 久久精品视频一区二区| 1区2区3区国产精品| 亚洲精品免费在线| 日韩电影在线一区二区| 麻豆国产欧美日韩综合精品二区| 精品一区二区国语对白| 国产91色综合久久免费分享| 99国产精品久久久久久久久久久| 波多野结衣中文字幕一区二区三区| 97精品久久久午夜一区二区三区| 欧美体内she精视频| 91精品在线免费观看| 免费久久99精品国产| 成人午夜电影久久影院| 色av一区二区| 日韩一本二本av| 国产精品欧美精品| 亚洲国产wwwccc36天堂| 国产乱码字幕精品高清av | 欧美一区二区三区白人| 91精品久久久久久久99蜜桃| 久久久综合网站| 夜夜精品视频一区二区 | 成人污污视频在线观看| 亚洲欧美日韩综合aⅴ视频| 亚洲精选视频在线| 美女国产一区二区| 色哟哟在线观看一区二区三区| 日韩美女主播在线视频一区二区三区| 国产精品午夜久久| 麻豆免费精品视频| 欧洲精品一区二区| 日本一区免费视频| 蜜桃av噜噜一区| 91久久精品国产91性色tv| 国产成人精品免费视频网站| 欧美性大战久久久久久久| 国产欧美综合色| 国内外成人在线视频| 8v天堂国产在线一区二区| 亚洲色图20p| 国产一区二区0| 欧美成人性战久久|