SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
OS 3.4 について
Kei kamikawa
yomitanpm # 6
OS という講義の課題
Perl で Shell を実装した話
※ 内部で sh 使わない
Shell でできること?
• フォアグラウンド実行 -> ps -al
• バックグラウンド実行 -> ps -al &
• パイプ -> ps -al ¦ cat -n
• サブシェル -> (ps -al ¦ cat -n)
Shell でできること?
• フォアグラウンド実行 -> ps -al
• バックグラウンド実行 -> ps -al &
• パイプ -> ps -al ¦ cat -n
• サブシェル -> (ps -al ¦ cat -n)
Perl で shell コマンド実行する方法
• system("ps -al")
• `ps -al`
• open を使う
• exec("ps -al")
system("ps -al )
501 42571 729 4006 0 31 0 2466408 15044 - S+ 0 ttys001 0:00.32 /Users/
CodeHex/.plenv/versions/5.20.2/bin/perl5.20.2 /Users/CodeHex
501 42627 42571 6006 0 0 0 0 0 - Z+ 0 ttys001 0:00.00 (sh)
0 42656 42571 4106 0 31 0 2435172 968 - R+ 0 ttys001 0:00.00 ps -al
print `ps -al`
501 42571 729 4006 0 31 0 2466408 15044 - S+ 0 ttys001 0:00.33 /Users/
CodeHex/.plenv/versions/5.20.2/bin/perl5.20.2 /Users/CodeHex
501 42627 42571 6006 0 0 0 0 0 - Z+ 0 ttys001 0:00.00 (sh)
0 42658 42571 4106 0 31 0 2435172 968 - R+ 0 ttys001 0:00.00 ps -al
内部で sh が実行される
sh はいらないね!
なので!
今回は exec を使いました
※ 都合上 open は省略
#!/usr/bin/env perl
use strict;
use warnings;
my @cmd = ("ps", "-al");
if (fork) {
wait;
} else {
exec @cmd;
}
例
exec には list を渡したほうがいいらしい
exec.pl
exec "ps -al"
501 42860 729 4006 0 31 0 2445592 2244 - S+ 0 ttys001 0:00.02 perl k.pl
0 42898 42860 4106 0 31 0 2444388 980 - R+ 0 ttys001 0:00.00 ps -al
_人人人人人人人人_
> sh がいない!! <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
Shell でできること?
• フォアグラウンド実行 -> ps -al
• バックグラウンド実行 -> ps -al &
• パイプ -> ps -al ¦ cat -n
• サブシェル -> (ps -al ¦ cat -n)
#!/usr/bin/env perl
use strict;
use warnings;
my @cmd = ("ps", "-al");
if (!fork) {
exec @cmd;
}
例
exec_bg.pl
Shell でできること?
• フォアグラウンド実行 -> ps -al
• バックグラウンド実行 -> ps -al &
• パイプ -> ps al ¦ cat -n
• サブシェル -> (ps al ¦ cat -n)
ところで
標準ストリーム知ってますか?
標準ストリーム
• STDIN (Standard input) <= 標準入力
• STDOUT (Standard output) <= 標準出力
• STDERR (Standard error) <= 標準エラー出力
例えば
ps al ¦ cat -n
ps al ¦ cat -n
STDOUT
or
STDERR
STDIN
結果を渡す
※あくまでイメージです
STDIN
or
Not
STDOUT
or
STDERR
➀
➁ ➂
➃
#!/usr/bin/env perl
use strict;
use warnings;
my @cmd1 = ("ps", "al");
my @cmd2 = ("cat", "-n");
pipe READ1, WRITE1;
pipe READ2, WRITE2;
if (fork) {
close READ1;
close WRITE2;
wait;
open STDIN, ">&", READ2;
exec @cmd2;
} else {
close READ2;
close WRITE1;
open STDOUT, ">&", WRITE2;
exec @cmd1;
}
例
pipe.pl
複数パイプは?
案. パイプの配列を作る
例えば
ps -al ¦ cat -n ¦ cowsay
ps -al ¦ cat -n ¦ cowsay
STDIN
or
Not
STDOUT
or
STDERR
STDIN
STDOUT
or
STDERR
STDIN
STDOUT
or
STDERR
STDIN
or
Not
STDOUT
or
STDERR
STDIN
STDOUT
or
STDERR
STDIN
STDOUT
or
STDERR
こういう並びのパイプの配列を用
意すればできる…!?
コードビュー(10秒)
multi_pipe.pl
Shell でできること?
• フォアグラウンド実行 -> ps -al
• バックグラウンド実行 -> ps -al &
• パイプ -> ps al ¦ cat -n
• サブシェル -> (ps al ¦ cat -n)
サブシェルって?
shell が shell を起動
PPIDPID
親プロセス 729 が 子プロセス 48015 を起動している
これを再現
コードビュー(10秒)
sub_perl.pl
ご静聴ありがとうございました
😄

Mais conteúdo relacionado

Mais procurados

initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
Takashi Takizawa
 
Lapp環境をソースからインストールする(debian)
Lapp環境をソースからインストールする(debian)Lapp環境をソースからインストールする(debian)
Lapp環境をソースからインストールする(debian)
Kimiyuki Yamauchi
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
Toshiki Tsuboi
 

Mais procurados (18)

initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
NDS#31
NDS#31NDS#31
NDS#31
 
超簡単!ActivePerlをWindows Serverにインストール
超簡単!ActivePerlをWindows Serverにインストール超簡単!ActivePerlをWindows Serverにインストール
超簡単!ActivePerlをWindows Serverにインストール
 
initramfsについて
initramfsについてinitramfsについて
initramfsについて
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
Solaris Container
Solaris ContainerSolaris Container
Solaris Container
 
Lapp環境をソースからインストールする(debian)
Lapp環境をソースからインストールする(debian)Lapp環境をソースからインストールする(debian)
Lapp環境をソースからインストールする(debian)
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 
Yohes kitchen
Yohes kitchenYohes kitchen
Yohes kitchen
 
Ubuntu 14.04にmysql version 5.6.16とmy sql workbench 6.1.4を入れるには!
Ubuntu 14.04にmysql version 5.6.16とmy sql workbench 6.1.4を入れるには!Ubuntu 14.04にmysql version 5.6.16とmy sql workbench 6.1.4を入れるには!
Ubuntu 14.04にmysql version 5.6.16とmy sql workbench 6.1.4を入れるには!
 
Introduction to Ostinato , network packet crafting and generator.
Introduction to Ostinato, network packet crafting and generator.Introduction to Ostinato, network packet crafting and generator.
Introduction to Ostinato , network packet crafting and generator.
 
Casperjsのインストール
CasperjsのインストールCasperjsのインストール
Casperjsのインストール
 
ServerWorks Sonic! 003 LT - GlusterをZabbixで監視してみた
ServerWorks Sonic! 003 LT - GlusterをZabbixで監視してみたServerWorks Sonic! 003 LT - GlusterをZabbixで監視してみた
ServerWorks Sonic! 003 LT - GlusterをZabbixで監視してみた
 
Lagopus 0.2
Lagopus 0.2Lagopus 0.2
Lagopus 0.2
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Iocage
IocageIocage
Iocage
 
Keynote In Japanese
Keynote In JapaneseKeynote In Japanese
Keynote In Japanese
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
 

Destaque

Destaque (10)

Okinawapm #1
Okinawapm #1Okinawapm #1
Okinawapm #1
 
Okinawapm#3
Okinawapm#3Okinawapm#3
Okinawapm#3
 
初見では読みづらいPerl
初見では読みづらいPerl初見では読みづらいPerl
初見では読みづらいPerl
 
作ったものを見せたかった話
作ったものを見せたかった話作ったものを見せたかった話
作ったものを見せたかった話
 
それPerlでできるよ
それPerlでできるよそれPerlでできるよ
それPerlでできるよ
 
はてなブックマークのトピックページの裏側 in YAPC::Asia Tokyo 2015
はてなブックマークのトピックページの裏側 in YAPC::Asia Tokyo 2015はてなブックマークのトピックページの裏側 in YAPC::Asia Tokyo 2015
はてなブックマークのトピックページの裏側 in YAPC::Asia Tokyo 2015
 
The story of language development
The story of language developmentThe story of language development
The story of language development
 
How to create/improve OSS products and its community
How to create/improve OSS products and its communityHow to create/improve OSS products and its community
How to create/improve OSS products and its community
 
ステージング環境のつくりかた
ステージング環境のつくりかたステージング環境のつくりかた
ステージング環境のつくりかた
 
Podcastを支える技術、エンジニアのためのWebメディア、そしてCPAN
Podcastを支える技術、エンジニアのためのWebメディア、そしてCPANPodcastを支える技術、エンジニアのためのWebメディア、そしてCPAN
Podcastを支える技術、エンジニアのためのWebメディア、そしてCPAN
 

Semelhante a Yomitanpm 6

Webサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみたWebサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
do_aki
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
CODE BLUE
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
do_aki
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
magoroku Yamamoto
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
tamtam180
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
icchy
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
kumachang_LL
 

Semelhante a Yomitanpm 6 (20)

about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
 
super_unkoをスーパーキレイにした
super_unkoをスーパーキレイにしたsuper_unkoをスーパーキレイにした
super_unkoをスーパーキレイにした
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみたWebサーバ勉強会4 nginx で php-fpm を動かしてみた
Webサーバ勉強会4 nginx で php-fpm を動かしてみた
 
ALPSチュートリアル(2) ALPSのインストール
ALPSチュートリアル(2) ALPSのインストールALPSチュートリアル(2) ALPSのインストール
ALPSチュートリアル(2) ALPSのインストール
 
Apacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasiaApacheの展望とmod_perlの超絶技巧 #yapcasia
Apacheの展望とmod_perlの超絶技巧 #yapcasia
 
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リーリナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
Hive on Spark を活用した高速データ分析 - Hadoop / Spark Conference Japan 2016
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Open modeler
Open modelerOpen modeler
Open modeler
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
ほしいプロトコルはトンネルすればいいじゃない at JAWS DAYS 2014 Tech Deep Dive
ほしいプロトコルはトンネルすればいいじゃない at JAWS DAYS 2014 Tech Deep Diveほしいプロトコルはトンネルすればいいじゃない at JAWS DAYS 2014 Tech Deep Dive
ほしいプロトコルはトンネルすればいいじゃない at JAWS DAYS 2014 Tech Deep Dive
 
Gr sakuraでtinet
Gr sakuraでtinetGr sakuraでtinet
Gr sakuraでtinet
 
Hive undocumented feature
Hive undocumented featureHive undocumented feature
Hive undocumented feature
 
シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)シェル芸初心者によるシェル芸入門 (修正版)
シェル芸初心者によるシェル芸入門 (修正版)
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 

Mais de Kei Kamikawa (7)

JWT を使ってみよう
JWT を使ってみようJWT を使ってみよう
JWT を使ってみよう
 
技術を身につける技術
技術を身につける技術技術を身につける技術
技術を身につける技術
 
俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている俺はこうして Go の CLI を作っている
俺はこうして Go の CLI を作っている
 
我輩が作ったものを淡々と
我輩が作ったものを淡々と我輩が作ったものを淡々と
我輩が作ったものを淡々と
 
grep.metacpan.orgのススメ
grep.metacpan.orgのススメgrep.metacpan.orgのススメ
grep.metacpan.orgのススメ
 
XS を始めよう!
XS を始めよう!XS を始めよう!
XS を始めよう!
 
Yomitan.pmに参加しようよ
Yomitan.pmに参加しようよYomitan.pmに参加しようよ
Yomitan.pmに参加しようよ
 

Yomitanpm 6