在Golang中,你可以使用syscall包來進行系統調用。syscall包提供了一系列與操作系統底層交互的函數。這些函數允許你執行文件操作、進程管理、網絡通信等任務。
以下是一些使用syscall包進行系統調用的示例:
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
// 打開文件
file, err := os.Open("test.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// 讀取文件內容
buf := make([]byte, 1024)
n, err := file.Read(buf)
if err != nil {
fmt.Println("Error reading file:", err)
return
}
// 輸出文件內容
fmt.Print(string(buf[:n]))
// 獲取文件信息
var stat syscall.Stat_t
err = syscall.Stat("test.txt", &stat)
if err != nil {
fmt.Println("Error getting file info:", err)
return
}
// 輸出文件大小
fmt.Println("File size:", stat.Size)
}
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
// 創建一個子進程
cmd := exec.Command("ls", "-l")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
err := cmd.Start()
if err != nil {
fmt.Println("Error starting command:", err)
return
}
// 等待子進程結束
err = cmd.Wait()
if err != nil {
fmt.Println("Error waiting for command:", err)
return
}
}
package main
import (
"fmt"
"net"
"syscall"
)
func main() {
// 創建一個TCP連接
conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
fmt.Println("Error connecting to server:", err)
return
}
defer conn.Close()
// 發送HTTP請求
_, err = conn.Write([]byte("GET / HTTP/1.0\r\n\r\n"))
if err != nil {
fmt.Println("Error sending request:", err)
return
}
// 讀取響應
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
// 輸出響應內容
fmt.Print(string(buf[:n]))
// 獲取底層文件描述符
fileDesc, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
if err != nil {
fmt.Println("Error creating socket:", err)
return
}
err = syscall.Connect(fileDesc, &net.TCPAddr{IP: net.ParseIP("93.184.216.34"), Port: 80})
if err != nil {
fmt.Println("Error connecting to server:", err)
return
}
err = syscall.Send(fileDesc, []byte("GET / HTTP/1.0\r\n\r\n"))
if err != nil {
fmt.Println("Error sending request:", err)
return
}
buf = make([]byte, 1024)
n, err = syscall.Recv(fileDesc, buf)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Print(string(buf[:n]))
// 關閉文件描述符
syscall.Close(fileDesc)
}
請注意,syscall包中的函數可能會因操作系統而異。在使用這些函數時,請確保你的代碼在目標平臺上兼容。在某些情況下,使用Go標準庫中的高級抽象(如os、net等包)可能更合適。