Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
[CAEC MeetUp#4] Go言語におけるos/execパッケージの豆知識
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Bo0km4n
January 28, 2019
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
[CAEC MeetUp#4] Go言語におけるos/execパッケージの豆知識
Bo0km4n
January 28, 2019
More Decks by Bo0km4n
See All by Bo0km4n
Kubernetes Casual Talk: Custom Controller in CyberAgent
bo0km4n
2
470
CA 1day Youth Bootcamp CIU Kubernetes
bo0km4n
2
1.5k
VictoriaMetrics+Prometheusで構築する複数Kubernetesの監視基盤
bo0km4n
4
3.7k
Study Golang by developing mini crawler
bo0km4n
0
130
Other Decks in Programming
See All in Programming
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
R8 の設定見直しでアプリサイズ削減
andpad
0
220
ActionController meets Protocol Buffers
sorah
0
480
気持ちぃ〜角丸 Squircle
ryu1013
0
310
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
420
すこし踏み込む CancellationToken
htkym
2
1.7k
AWSに止められる覚悟してますか?
morizo_1984
2
530
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
170
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
210
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Abbi's Birthday
coloredviolet
4
10k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
New Earth Scene 8
popppiees
4
2.7k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Docker and Python
trallard
47
4.2k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
320
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The Limits of Empathy - UXLibs8
cassininazir
2
720
Transcript
Goͷos/execύοέʔδʹ͓͚Δ౾ࣝ CAEC MeetUp #4 (1/28)
2 About Me @KKawabe108 Software Engineer • ෦ উ •
ࣳӜۀେֶେֶӃ ిؾిࢠใֶઐ߈M1 • όΠτઌ: ͳ͠ • ڵຯ: OS, ࢄγεςϜ, ݴޠॲཧܥ • ͋ͱΫϥυपΓશൠ • ࠷ۙ࡞ͬͨͷ: ࢄKVS(raft), ΠϯλϓϦλ
Goݴޠʹ͍ͭͯ About Go which is programming language 01 03 02
Google͕։ൃͨ͠ίϯύΠϧܕݴޠ(Ken ThompsonRob PikeΒ͕ઃܭͨ͠) ੩తͳܕ͚Λߦ͏ݴޠͰڊେͳγεςϜͰ։ൃతʹ, ύϑΥʔϚϯεతʹεέʔϧ͢Δ. GoroutineΛ࢝Ίͱͨܰ͠ྔͳฒྻॲཧػߏΛαϙʔτ͢Δ ϝδϟʔͳΤσΟλͰ΄΅ϑΥʔϚολ͕αϙʔτ͞Ε͍ͯΔͷͰଞਓͷίʔυ͕ඇৗʹ ಡΈ͍͢ɹ<= ݸਓతʹܹਪ͠ϙΠϯτ
ύοέʔδʹ͍ͭͯ About Go which is programming language • ϓϩάϥϜͷ໊લۭؒΛ͚ΔͨΊͷΈ •
ಛఆͷॲཧΛύοέʔδʹΓ͚Δ͜ͱͰӅṭԽΛߦ͏ • େମଞͷݴޠͷϥΠϒϥϦύοέʔδػߏͱಉ͡ײ֮Ͱ͑Δ
os/exec ύοέʔδ About os/exec package GoͰ֎෦ίϚϯυΛ࣮ߦ͢Δࡍʹ͏. ࣮ࡍʹGoͷϥϯλΠϜ͕goroutineΛ ͍, Α͠ͳʹผϓϩηεͷڍಈΛཧ ͯ͘͠ΕΔ.
1 package main 2 3 import ( 4 "os/exec" 5 ) 6 7 func main() { 8 cmd := exec.Command("ls", "-la") 9 if err := cmd.Run(); err != nil { 10 panic(err) 11 } 12 }
͋Δ, ༡ΜͰ͍Δͱ One day, I had be coding… 1 #include<stdio.h>
2 #include<stdlib.h> 3 #include<unistd.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <fcntl.h> 7 8 int main(){ 9 int result = write(0, "hello", 6); 10 if(result == -1){ 11 perror("write"); 12 exit(1); 13 } 14 printf("\nresult = %d", result); 15 return 0; 16 } ඪ४ೖྗʹhelloͱwriteγεςϜίʔϧ Ͱॻ͖ࠐΉ͚ͩͷίʔυ $ gcc sample.c -o sample $ ./sample hello result = 6%
os/execܦ༝Ͱ࣮ߦ͠Α͏ͱ͢Δͱ Try execute binary via os/exec. $ go run sample_exec.go
2019/01/21 11:01:30 exit status 1 exit status 1 Why??? 1 package main 2 3 import ( 4 "log" 5 "os/exec" 6 ) 7 8 func main() { 9 cmd := exec.Command("./sample") 10 if err := cmd.Run(); err != nil { 11 log.Fatal(err) 12 } 13 }
8 όΠφϦͷ ͳͷ͔ ࣮ߦݖݶपΓ ͳͷ͔৭ʑௐ͚ͨͲ݁ہղܾ͠ͳ͔ͬͨ
9 TwitterͰฉ͍ͯΈͨ Help me twitter.
10 exec.Cmdߏମ exchange stdin ͔֬ʹexec.CommandͷฦΓͰ͋Δexec.Cmdߏମඪ४ೖྗͷϝϯόΛ࣋ͬͯΔ
11 exec.Cmdͷ࣋ͭ, stdinΛૠ͛ସ͑Δ exchange stdin 1 func main() { 2
cmd := exec.Command("./sample") 3 cmd.Stdin = os.Stdin 4 _, err := cmd.Output() 5 if err != nil { 6 log.Fatal(err) 7 } 8 } 1 $ go run sample_exec.go 2 hello 1 package main 2 3 import ( 4 "log" 5 "os/exec" 6 ) 7 8 func main() { 9 cmd := exec.Command("./sample") 10 if err := cmd.Run(); err != nil { 11 log.Fatal(err) 12 } 13 } OutputؔRunͯ͠ ඪ४ग़ྗʹॻ͖ࠐ·Εͨ݁Ռऔಘ͢Δ
12 ্ख͍ͬͨ͘!!! Ͱ, ԿͰϓϩηεͷඪ४ೖྗΛม͑Δͱ্ख͘ߦ͘ͷʁ
13 exec.CmdपΓͷίʔυΛͬͯΈΔ investigate exec.Cmd codes.
14 Let’s go 1 func (c *Cmd) Output() ([]byte, error)
{ 2 if c.Stdout != nil { 3 return nil, errors.New("exec: Stdout already set") 4 } 5 var stdout bytes.Buffer 6 c.Stdout = &stdout 7 8 captureErr := c.Stderr == nil 9 if captureErr { 10 c.Stderr = &prefixSuffixSaver{N: 32 << 10} 11 } 12 13 err := c.Run() 14 if err != nil && captureErr { 15 if ee, ok := err.(*ExitError); ok { 16 ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes() 17 } 18 } 19 return stdout.Bytes(), err 20 } 1 func (c *Cmd) Run() error { 2 if err := c.Start(); err != nil { 3 return err 4 } 5 return c.Wait() 6 } ݁ہStartΛݺΜͰΔͷͰStartΛಡ͏ Cmdߏମͷඪ४ೖྗॳظԽ෦Λ୳͢ StdoutͱStderrʹؔͯ͠ॳظԽ͍ͯ͠Δ
15 Cmdߏମͷඪ४ೖྗॳظԽ෦Λ୳͢ Let’s go 1 func (c *Cmd) Start() error
{ 2 3 ... 4 5 type F func(*Cmd) (*os.File, error) 6 for _, setupFd := range []F{(*Cmd).stdin, (*Cmd).stdout, (*Cmd).stderr} { 7 fd, err := setupFd(c) 8 if err != nil { 9 c.closeDescriptors(c.closeAfterStart) 10 c.closeDescriptors(c.closeAfterWait) 11 return err 12 } 13 c.childFiles = append(c.childFiles, fd) 14 } 15 c.childFiles = append(c.childFiles, c.ExtraFiles...) 16 17 ... 18 19 } ඪ४ೖྗͷॳظԽͬΆ͍ॲཧΛݟ͚ͭͨ Cmdߏମʹඥͮ͘stdinͱ͍͏ ؔϙΠϯλ
16 Cmdߏମͷඪ४ೖྗॳظԽ෦Λ୳͢ Let’s go 1 func (c *Cmd) stdin() (f
*os.File, err error) { 2 if c.Stdin == nil { 3 f, err = os.Open(os.DevNull) 4 if err != nil { 5 return 6 } 7 c.closeAfterStart = append(c.closeAfterStart, f) 8 return 9 } 10 11 if f, ok := c.Stdin.(*os.File); ok { 12 return f, nil 13 } 14 15 pr, pw, err := os.Pipe() 16 if err != nil { 17 return 18 } /dev/nullΛopenͯ͠ඪ४ೖྗ ʹׂΓ͍ͯͯΔʂ ͋ΕʁͰ/dev/null writeγεςϜίʔϧͰ ॻ͖ࠐΊΔͣ ౾ࣝ: goฦΓʹ໊લΛ͚ͭΔ ͜ͱ͕Ͱ͖, return͢ΔͱσϑΥϧ τͰͦͷ໊લͷมΛฦ͢
17 1 2 func main() { 3 devNull, _ :=
os.Open("/dev/null") 4 b, err := syscall.Write(int(devNull.Fd()), []byte("hello")) 5 if err != nil { 6 log.Fatal(err) 7 } 8 fmt.Println(b) 9 } ࣅͨΑ͏ͳίʔυͰ࣮ݧͯ͠ΈΔ experiment 1 go run sample_devnull.go 2 2019/01/21 13:56:03 bad file descriptor 3 exit status 1
18 Error: Bad file descriptor experiment ϑΝΠϧσΟεΫϦϓλʹ ॻ͖ࠐΈݖݶ͕༩͞Εͯͳ͍
19 os.OpenͷgodocΛಡΜͰΈΔͱɾɾɾ read GoDoc Read OnlyͰ։͍ͯΔ͔Βॻ͖ࠐΊͳ͔ͬͨʂʂʂ
20 ·ͱΊ conclusion • Goͷos.execύοέʔδ֎෦ίϚϯυΛ࣮ߦ͢Δࡍ, σϑΥϧτͰඪ४ೖྗΛ/dev/nullʹઃఆ͢Δ • ͜ͷ࣌, Read OnlyͳͷͰॻ͖ࠐΈͰ͖ͳ͍
• ॻ͖ࠐΈ͍ͨ࣌cmd.Stdinʹॻ͖ࠐΈݖݶΛ༩ͨ͠σΟεΫϦϓλΛઃఆ͠Α͏
Thank you for listening! Let’s fun programming with go!