Dengan perkembangan teknologi komputer yang berterusan, keperluan kami untuk sistem komputer semakin tinggi. Dalam proses ini, peranan sistem pengendalian menjadi semakin penting. Linux ialah sistem pengendalian yang biasa digunakan, dan panggilan sistemnya telah menjadi bahagian asas sistem Linux. Sebagai bahasa berprestasi tinggi untuk pembangunan pesat, bahasa Go secara semula jadi menyokong panggilan sistem Linux dan menyediakan antara muka pengaturcaraan asas yang mudah untuk sistem pengendalian.
Artikel ini akan memperkenalkan cara menggunakan panggilan sistem Linux dalam bahasa Go, dan menerangkannya secara terperinci dengan kod dan contoh yang berkaitan.
1. Asas panggilan sistem Linux
Panggilan sistem Linux merujuk kepada antara muka yang disediakan dalam sistem pengendalian Linux untuk mengakses fungsi kernel sistem. Panggilan sistem Linux boleh dilihat sebagai satu cara untuk proses pengguna membuat permintaan kepada kernel Permintaan ini mungkin untuk mendapatkan maklumat tertentu, melakukan operasi khusus tertentu, dsb.
Di Linux, nombor panggilan sistem dipanggil nombor panggilan sistem Apabila menggunakan panggilan sistem, anda perlu menghantar parameter yang sepadan ini adalah arahan dan data yang dihantar oleh proses pengguna ke kernel . Nilai pulangan panggilan sistem juga diletakkan dalam daftar khas dan dikembalikan kepada proses pengguna. Panggilan sistem dilaksanakan di Linux menggunakan gangguan lembut, iaitu dengan memanggil arahan int 0x80 untuk mencapai penukaran daripada mod pengguna kepada mod kernel.
2. Panggilan sistem dalam bahasa Go
Pustaka syscall digunakan dalam bahasa Go untuk melaksanakan panggilan sistem. Pustaka ini merangkum semua panggilan sistem dalam sistem Linux dan menyediakan antara muka bersatu yang boleh digunakan oleh pengaturcara.
Panggilan sistem yang biasa digunakan termasuk:
Kami mengambil panggilan sistem yang biasa digunakan di atas sebagai contoh untuk menerangkan cara Menggunakan panggilan sistem dalam bahasa Go.
Untuk membuka fail/direktori dalam bahasa Go gunakan panggilan sistem Buka:
func Open(rentetan laluan, bendera int, perm uint32) (uintptr, ralat)
di mana laluan mewakili laluan fail/direktori terbuka mewakili bendera operasi, seperti O_RDONLY mewakili mod baca sahaja, O_WRONLY mewakili mod tulis sahaja, O_RDWR mewakili; mod baca-tulis, O_CREATE Ia bermaksud mencipta fail, dsb.; perm bermaksud kebenaran fail/direktori, seperti 0777 bermakna fail itu boleh dibaca, ditulis dan dilaksanakan. Nilai pulangan bagi fungsi Buka ialah deskriptor fail jenis uintptr dan ralat jenis ralat.
Berikut ialah contoh kod yang menunjukkan cara membuka fail dan membaca kandungan fail dalam bahasa Go:
package main import ( "fmt" "os" "syscall" ) func main() { filePath := "test.txt" fd, err := syscall.Open(filePath, syscall.O_RDONLY, 0) if err != nil { fmt.Println("Open file error:", err) return } defer syscall.Close(fd) fileInfo, err := os.Stat(filePath) if err != nil { fmt.Println("Get file info error:", err) return } fileSize := fileInfo.Size() buf := make([]byte, fileSize) n, err := syscall.Read(fd, buf) if err != nil { fmt.Println("Read file error:", err) return } fmt.Printf("Read %d bytes from file: %s", n, string(buf)) }
Gunakan panggilan sistem Baca untuk membaca kandungan daripada fail/direktori Kod sampel adalah seperti berikut:
package main import ( "fmt" "syscall" ) func main() { fd, err := syscall.Open(".", syscall.O_RDONLY, 0) if err != nil { fmt.Println("Open directory error:", err) return } defer syscall.Close(fd) buf := make([]byte, 1024) // 循环遍历文件/目录中的内容 for { n, err := syscall.Read(fd, buf) if err != nil { fmt.Println("Read directory error:", err) return } // 如果已经读取到文件/目录尾部,则退出循环 if n == 0 { break } fmt.Printf("%d bytes: %s", n, string(buf[:n])) } }
Gunakan. panggilan sistem Tulis untuk Tulis kandungan ke fail/direktori Contoh kod adalah seperti berikut:
package main import ( "fmt" "syscall" ) func main() { filePath := "test.txt" fd, err := syscall.Open(filePath, syscall.O_RDWR|syscall.O_APPEND, 0) if err != nil { fmt.Println("Open file error:", err) return } defer syscall.Close(fd) content := "Hello, World! " n, err := syscall.Write(fd, []byte(content)) if err != nil { fmt.Println("Write file error:", err) return } fmt.Printf("Write %d bytes to file. ", n) }
Gunakan panggilan sistem Dekat dengan. tutup fail/direktori yang sudah terbuka. Kod contoh adalah seperti berikut:
package main import ( "fmt" "syscall" ) func main() { fd, err := syscall.Open(".", syscall.O_RDONLY, 0) if err != nil { fmt.Println("Open directory error:", err) return } // 进行相关的操作 syscall.Close(fd) }
Gunakan panggilan sistem Alih keluar untuk memadam fail/direktori contoh kod adalah seperti berikut:
package main import ( "fmt" "syscall" ) func main() { filePath := "test.txt" err := syscall.Remove(filePath) if err != nil { fmt.Println("Remove file error:", err) return } fmt.Println("Remove file success.") }
3 Ringkasan
Artikel ini terutamanya bercakap tentang cara menggunakan panggilan sistem Linux dalam bahasa Go. Kami memperkenalkan pengetahuan asas tentang panggilan sistem, digabungkan dengan panggilan sistem yang biasa digunakan (Buka, Baca, Tulis, Tutup, Alih Keluar) untuk menerangkan secara terperinci dan memberikan kod sampel yang berkaitan.
Selepas mengkaji artikel ini, saya percaya anda telah menguasai kaedah asas menggunakan panggilan sistem dalam bahasa Go. Saya harap ia akan membantu anda.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan panggilan sistem Linux dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!