제가 시부천 씨의 Go를 해보면 알 수 있는 시스템 프로그래밍을 해봤어요(1)
19138 단어 Go
자신의 필기를 하다.
디버거 설정
이 연재의 중점은 원고이기 때문에 준비해 보아야 한다.IntelliJ를 사용하지 않았기 때문에 Visual Studio Code를 사용하여 동일한 설정을 했습니다.이것은 매우 간단하다.VScode에서 다음 장소로 디버거를 설정합니다.
틀만 있으면 돼.내 이름은 바뀌었을 뿐이야.
launch.json{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Go Launch file",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${file}"
},
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${fileDirname}",
"env": {},
"args": [],
"showLog": true
}
]
}
연재를 즐기는 재미만 남았습니다.
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Go Launch file",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${file}"
},
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "debug",
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",
"program": "${fileDirname}",
"env": {},
"args": [],
"showLog": true
}
]
}
첫 번째 에서는 파일 설명자를 설명합니다.Go의 경우
(f *File)io.Write(b []byte) (n int, err error)
의 인터페이스가 같으면 다각형과 유사할 수 있다.OS 수준에서 파일 설명자는 파일뿐만 아니라 비표준 출력, 소켓, 임의 수 등의 파일도 처리할 수 있다.따라서 OS의 차이를 숨기기 위해 파일 설명자를 나타내는 구조체를 만들어 조작을 통해 OS의 차이를 흡수한다.
Write 메서드(예: File이 아닌 FD) 구조체.
fd_unix.go
func (fd *FD) Write(p []byte) (int, error) {
if err := fd.writeLock(); err != nil {
return 0, err
}
defer fd.writeUnlock()
if err := fd.pd.prepareWrite(fd.isFile); err != nil {
return 0, err
}
var nn int
for {
max := len(p)
if fd.IsStream && max-nn > maxRW {
max = nn + maxRW
}
n, err := syscall.Write(fd.Sysfd, p[nn:max])
if n > 0 {
nn += n
}
if nn == len(p) {
return nn, err
}
if err == syscall.EAGAIN && fd.pd.pollable() {
if err = fd.pd.waitWrite(fd.isFile); err == nil {
continue
}
}
if err != nil {
return nn, err
}
if n == 0 {
return nn, io.ErrUnexpectedEOF
}
}
}
파일의 FD 정의입니다.파일 설명자는 숫자인 것 같습니다. 이외에도 정보 보호가 있습니다.type FD struct {
// Lock sysfd and serialize access to Read and Write methods.
fdmu fdMutex
// System file descriptor. Immutable until Close.
Sysfd int
// I/O poller.
pd pollDesc
// Writev cache.
iovecs *[]syscall.Iovec
// Whether this is a streaming descriptor, as opposed to a
// packet-based descriptor like a UDP socket. Immutable.
IsStream bool
// Whether a zero byte read indicates EOF. This is false for a
// message based socket connection.
ZeroReadIsEOF bool
// Whether this is a file rather than a network socket.
isFile bool
}
file stream
0
stdin
1
stdout
2
stderr
이후 이번 보도에서는 다양한 방법
io.Write
이 시행된다.파일, http 버퍼링, 서버, gzip 압축 등 장식 도안이 생각납니다.버퍼가 있는 기능은Flush()
인데 Go는 버퍼링 없이 갑자기 시스템 호출을 하는 방식이지만 성능에는 문제가 없다.샘플 프로그램
그러면 베껴 쓰면서 재미있는 기사를 읽고, 선생님의 가르침에 따라 자신도 간단한 실복을 만들어 보았습니다.실시해 보았다io.Write
.자세한 설명은 없지만 알파벳 암호화 라이터 wpackage main
import (
"fmt"
"io"
"os"
)
type asciiEncryptWriter struct {
w io.Writer
}
func (ew *asciiEncryptWriter) Write(p []byte) (int, error) {
var b [1]byte
r := 0
for n, _ := range p {
b[0] = p[n]
if ('a' <= b[0] && b[0] <= 'z') || ('A' <= b[0] && b[0] <= 'Z') {
if b[0] == 'z' {
b[0] = 'a'
}
if b[0] == 'Z' {
b[0] = 'A'
}
b[0]++
}
nw, err := ew.w.Write(b[:])
if err != nil {
return nw, err
}
}
return r, nil
}
// NewASCIIEncryptWriter provide super strong word encryption.
func NewASCIIEncryptWriter(w io.Writer) *asciiEncryptWriter {
return &asciiEncryptWriter{w}
}
func main() {
w := NewASCIIEncryptWriter(os.Stdout)
fmt.Fprintln(w, "Very Strong Encryption")
}
실행Wfsz Tuspoh Fodszqujpo
이것은 재미있는 연재다.나는 프로그래밍의 즐거움이 생각났다.앞으로의 내용이 무척 기대된다.
Reference
이 문제에 관하여(제가 시부천 씨의 Go를 해보면 알 수 있는 시스템 프로그래밍을 해봤어요(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/TsuyoshiUshio@github/items/e942002be908f36bf6d4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
package main
import (
"fmt"
"io"
"os"
)
type asciiEncryptWriter struct {
w io.Writer
}
func (ew *asciiEncryptWriter) Write(p []byte) (int, error) {
var b [1]byte
r := 0
for n, _ := range p {
b[0] = p[n]
if ('a' <= b[0] && b[0] <= 'z') || ('A' <= b[0] && b[0] <= 'Z') {
if b[0] == 'z' {
b[0] = 'a'
}
if b[0] == 'Z' {
b[0] = 'A'
}
b[0]++
}
nw, err := ew.w.Write(b[:])
if err != nil {
return nw, err
}
}
return r, nil
}
// NewASCIIEncryptWriter provide super strong word encryption.
func NewASCIIEncryptWriter(w io.Writer) *asciiEncryptWriter {
return &asciiEncryptWriter{w}
}
func main() {
w := NewASCIIEncryptWriter(os.Stdout)
fmt.Fprintln(w, "Very Strong Encryption")
}
Wfsz Tuspoh Fodszqujpo
Reference
이 문제에 관하여(제가 시부천 씨의 Go를 해보면 알 수 있는 시스템 프로그래밍을 해봤어요(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TsuyoshiUshio@github/items/e942002be908f36bf6d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)