質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

808閲覧

linux プロセス ファイル 標準入出力 関連の用語理解確認を...

akiyama3284pga

総合スコア186

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/01/20 02:08

編集2022/01/23 15:49

linuxにおけるeverythig-is-fileという概念を理解するべく、暫く知識を蓄えておりましたが、
抽象的な部分が多く理解できているのか全く自身がございませんので、自分の認識があっているのか
確認して頂ければ助かります。文脈がばらばらで申し訳ございません。


Linuxでは全てをファイルとして扱うという仕様があり、それを理解することが
Linuxを深く理解する上で重要なこと。
ファイルはかなりフワフワとした概念で、
・デバイスファイルという特殊ファイル
・各プロセス
などもファイルに該当する。

(追記)本文は、WSL1環境でのものであり、純粋に起動したLinux環境のGUI端末ではデバイスファイルは、/dev/pts/1... のようになる。

・デバイスファイル(スペシャルファイル)について
デバイスファイルというのは、仮想的(ソフトウェア)に入力と出力を実現させる機構を備えたプラットフォームのようなもので、
キーボードを標準入力、ターミナル画面を標準出力という構造の中身を気にしなくていいようにしてくれている。
なので、Bashシェルなどで入力と出力が抽象化された形で行える。

上のデバイスファイルはいつ作られるのかと言うと、Bashシェルが起動した際、その起動したものに1:1で特定できるように作成され、
/dev/以下にtty1, tty2...のように配置される。
(修正)正確には起動前に作られる。
これのおかげで複数のBashを立ち上げてもそれぞれのターミナルでそれぞれの標準入・出力が行われ、被ることはない。

意図的に echo 'aaa' > /dev/tty1(他のターミナルのデバイスファイル)という風にして標準出力先を変更(リダイレクト)させることは可能
これは、echo 'aaa' > my.txt としているのと原理的に何ら変わりはない。(SSH接続時も同様)
つまり、ファイルさえ手元にあれば(sshの場合は許可が当然必要)どこで起動しているターミナルであれ、そこのファイル(デバイスファイル)に
リダイレクトさせることができる。

某サイト様ではデバイスファイルのことを画面ファイルと表現されており、これは個人としてはしっくりきた。

・プロセスについて
上の文でもプロセスは非常に関係している。
linuxにおいては全て(コマンド、ファイル実行...)はプロセス単位毎に管理される。
psコマンドで確認可能

プロセスには親プロセスと子プロセスというものがあり、大元最上位に来る親がubuntuではinit(=systemd)
なので、bashを立ち上げるとそのタイミングではinit...__bashという形となっている。
(追記)init...としているのは、実際にはsystemdとbashの間にはまだ多くのプロセスが介在しているから。
そして、bashで起動したコマンドなどはそのbashプロセスの子プロセスとなる。

全てのプロセスがどれかのbash(デバイスファイル=tty)に紐づいているという訳ではなく、
例えばsystemdは必要なものや作成してenableしたサービスのプロセスを立ち上げるているので、この段階でも他にいくつかのttyに紐づかないプロセスが立ち上がっている。

pythonプログラムもプロセスとして起動するので、仮にそのプログラム内でsubprocess.Popen('ls')としていた場合、
init...bash__python[ls] という形となる。

当然、別のbashで同じプログラムを起動した場合はそのbashのプロセスが親となり、その子プロセスとしてpythonプログラムが動く。(両者initという共通の親プロセス)

(追記)なぜ、あるシェルで実行したコマンドの出力がそのシェルの標準出力と同じところ(画面)に出るかというと、親プロセスのfdの状態を子プロセスは受け継ぐため。
つまり、親の標準出力(入力、エラー、その他3以上のも同様)などのfdと同じファイル(やデバイスファイル)を向く。

・デバイスファイルとプロセスとfdと標準入出力、標準エラー出力の関係について
全てのプロセスには、必ずfd:0, fd:1, fd2が自動でセットされる。
当然、個々のbashプロセスにも、lsコマンドにも、pythonスクリプトにも...
なので、bashプロセスでlsと打つことができる(標準入力)し、もし仮にlsが何らかの入力を求めるものだったとしたら、そのlsプロセスにも標準入力することができるし、
その結果が画面ファイル(デバイスファイル)へと表示される(標準出力)。


大体このような認識でeverything_is_file という概念を大まかに理解したつもりではいるのですが、
抽象化された概念や解説が多く、全く自信がございません。
ご指摘や修正など賜れましたら幸甚でございます。
よろしくお願いいたします。<(_ _)>

以下追記のみ....

参考になりました。
この2記事でほぼ自分の疑問や間違いなど訂正されました。
https://qiita.com/angel_p_57/items/1faafa275525469788b4
https://qiita.com/angel_p_57/items/03582181e9f7a69f8168#%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A8%E7%94%BB%E9%9D%A2%E3%81%A3%E3%81%A6

☑シェル、デバイスファイルへの理解
シェルは画面ではない。対応する動作をカーネルに指示する実態は目に見えないもの。
この事実をしっかり理解していればスムーズに理解が及んでいたように思える。

シェル自身では入力や出力を用意できないから、それをosの仮想コンソールドライバが用意
している。
このドライバが画面であり、入力も受け持つ。

コンソールは初期として複数用意されている。
その際に、各osの仮想コンソールドライバとコンソールを紐づける管理情報としてデバイスファイル
があり、中身は単にその管理情報があるのみ。

仮想コンソールドライバ1 <=> /dev/tty1
仮想コンソールドライバ2 <=> /dev/tty2 ...
この時、当然いくつこのセットができようと各セットが紐づくシェルは一つ。

たったこれだけの基礎を頭に入れるだけで、他のことが応用として理解がすぐに及んだ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2022/01/20 04:30

/dev/tty/1 などは普通無いですが、/dev/pty/1 との混同でしょうか?
akiyama3284pga

2022/01/20 04:44

お世話になっております。 失礼いたしました。 /dev/tty1 と書かなくてはいけないところを全て /dev/tty/1 のように記述してしまっておりました。 修正いたしました。
guest

回答3

0

「Linuxでは全てをファイルとして扱う」の「全て」ってなに? あるいは、「ファイル」とは一言で言うとなんですか? と。
つまり、要約できるかどうかというところが問題かと思います。むしろ詳細は後です。そこは見た感じ怪しいのではないでしょうか。
記事「Linuxのファイルの種類」に色々書いてますので、参考にどうぞ。

某サイト様ではデバイスファイルのことを画面ファイルと表現されており、これは個人としてはしっくりきた。

その表現は捨てた方が良いです。デバイスは画面に限った話ではないですし。
tty なら画面は関係あるのですが、WSLなら /dev/tty1,2,… が身近だとしても、一般には pty の方かなと思います。
※screen, tmuxのようなターミナル仮想化/多重化でも裏で pty が使われます。
tty/pttの話は 記事「標準入力・標準出力ってなに?」の「キーボードと画面って?」の章を参考にどうぞ。

そのlsプロセスにも標準入力することができるし、
その結果が画面ファイル(デバイスファイル)へと表示される(標準出力)。

「標準入力」「標準出力」の用語のカテゴリ自体に誤認識があります。( 巷の説明が悪いからだとは思いますが )
これらは「(実行環境がプログラム起動に先駆けて何らかのファイルに結び付けておく) 言語処理系に『標準』で用意された『入出力を司るオブジェクト』です。
※もうちょっと言うと、ファイルディスクリプタ0,1,2をラップする(包み込む)形でオブジェクトが用意されるので、大抵どの言語でも共通の用語として流通しています。

標準入力・標準出力については、上記のリンク先の記事「標準入力・標準出力ってなに?」で説明しています。

プロセスについては単純に「プログラムの実行単位」くらいで良いです。親子関係もファイルの件でそこまで深入りする必要はないです。
ただ、新しくプロセスが生成されるとき、「あるプロセスの状況がコピーされて作られる」ことで、ファイルへの接続状況が継承されるというところは、それなりに関連してくるところかと思います。

投稿2022/01/20 14:30

angel_p_57

総合スコア1672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/01/20 17:00 編集

ご回答ありがとうございます。 自身ここまで一つの概念に対する説明の口があるものに初めて出会いまして、頭の整理が追いついていない状況でございました。 頂いた資料を基に特に標準関連の用語についてはしっかりと頭に入れてられるよう勉強させて頂きます。 おっしゃいます通り、wslを使わないピュアなlinux環境におきましては、/dev/pts/... の方が目にすることが多いだろうと先ほど行いました検証で納得いたしました。 疑問が何点かございます。 pty にはtty1.2...同様番号が付けられ、それがptyだとpts/配下で1, 2...のように管理されるということでしょうか? 2つ目の頂きましたリンクにおける、 「シェル上で起動したコマンドはそれらを引き継ぐ」という部分が、 「新しくプロセスが生成されるとき、あるプロセスの状況がコピーされて作られる」ということに等しいということでよろしいでしょうか? ファイルへの接続状況が継承がされるのがそれなりに重要なのは、 例えば親のbashプロセスのttyが/dev/pts/1 ならそこで実行されるlsコマンドプロセスのttyも同様の/dev/pts/1を向いてくれるから、 所謂fdの枯渇などの問題が起こる原因が説明できるから、 というような理由からでよろしいでしょうか? 分かりにくい文面で申し訳ございません。
angel_p_57

2022/01/22 02:43

> 疑問が何点かございます。 疑問については回答しますが、「全てがファイル」という点の理解が目的であれば、細かい所に拘るのはかえって逆効果だということはご注意ください。答えは既に紹介した記事「Linuxのファイルの種類」の最初の「導入」の章に書いてあります。まずは、それをいかに「あっさりと」把握できるかです。 > pty にはtty1.2...同様番号が付けられ、それがptyだとpts/配下で1, 2...のように管理されるということでしょうか? はい。ただし流儀は2つあります。Linuxで通常使うのはUNIX98-PTYの方です。詳細はptyやptsのmanページをご覧ください。 https://linuxjm.osdn.jp/html/LDP_man-pages/man7/pty.7.html https://linuxjm.osdn.jp/html/LDP_man-pages/man4/pts.4.html > 「新しくプロセスが生成されるとき、あるプロセスの状況がコピーされて作られる」ということに等しい 「等しい」というより、「継承」の細部だと考えてください。「『コピーされる』ことで『継承』される」と説明しているのはそういう意図です。 ※今回の質問では「ファイルディスクリプタ」と用語が出ているので、説明を一段階詳細化させています。 > ファイルへの接続状況が継承がされるのがそれなりに重要なのは、 この点は標準入力/出力/エラーの理解に関わるからです。 > 例えば親のbashプロセスのttyが 「プロセスのtty」に近い概念はありますが、「ファイルへの接続状況」とは直接関係ありません。上で「逆効果」と表現した点にご注意ください。 しかし、1つのポイントとして次のように「(既にttyと接続された)bashから起動されたプログラムも同じttyを通じてユーザとデータをやりとりできる」を実現するのに「継承」がなければ面倒だろうというのは挙げても良いかと思います。 https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F74396%2F774fd98f-17c4-3a9b-5a9d-1ee03e10a28b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=cb262df755678fe556ddb0848482c749 それよりも「この点は標準入力/出力/エラーの理解に関わるから」という点です。 回答で「実行環境がプログラム起動に先駆けて何らかのファイルに結び付けておく」と説明しています。これを実現するのに「継承」がないと非現実的なのはイメージできるでしょうか。 また、「継承」があるからこそ、それを切り替えるシェルの「リダイレクト」「パイプライン」といった機能に意味が出てきます。つまり裏表の関係になっているのです。
akiyama3284pga

2022/01/22 12:21 編集

継承という部分におきまして、 自分なりの整理を書かせて頂きます。(かなり無理がある部分があるかもしれません...ご容赦ください。) ------------------------------------------------------------------------------------- 一般的な言語の継承関係で考え、オブジェクト(fdをラップする)をクラスと考えると.. クラスが継承される形で、どんどんと(子)クラス(=子プロセス)を作成されていく。 もし、上部のクラスで内容が変更されるとそれを継承しているクラスの内容も同じく変わる。 なので枝先のクラスでのみで機能を切り替える際には、そのクラス独自にリダイレクトなどを使用すればいい。 実行結果を基にした例として、 bash1において、プログラム内でsubprocess.Popen(['ls'])を書いた、pythonプログラム(my.py)を python my.py > test.txt と実行すると、 一時的に、pythonプログラム(my.py)プロセスの標準出力先がtest.txtへと変更(リダイレクト)され、 継承先のsubprocess.Popen(['ls'])子プロセスが実行される際(直前)に継承されるので、 プログラム内部で実行するsubprocess.Popen(['ls'])の標準出力先もtest.txtとなり、結果としてtext.txt内にlsの結果が出力される。 bash──python───ls 実行後は変更が破棄され、pythonプログラムの標準出力先が元の状態に戻り、当然継承先の(既に破棄されているがまだあるとした場合)lsプロセスの標準出力先もそれと同じく戻る。 この仕組みを継承なしでしようとするのはかなり非現実的... ----------------------------------------------------------------------------------------- 一つ不安な点は、 頂いた資料中、出力リダイレクトは、標準出力を指定のファイルに繋ぎ替える機能という記述がございました。 繋ぎ変えるというのがもし、一時的に標準出力(fd:1)の対応するファイルを変えるのではなく、標準出力は変えずに本来の意味でのリダイレクトをしているだけだとしますと、 pythonプログラムプロセスの継承先のlsコマンドのプロセスの標準出力先は依然として画面(デバイスファイル)のままですので、lsの結果は画面に表示されてしまうことになり、上の文はおかしいということになります。 そもそもでどこかに理解の欠落があるということでしょうか...? 自分が最初に書いておりました、そのlsプロセスにも標準入力することができるし... という部分は今考えますと稚拙だと感じることができます。 そこで、今現在の標準入力へ理解は(出力は省略いたします。)、 ----------------------------------------------------------------------------------------------- 標準入力 標準入力は動詞で使用すると多くの誤解を生むことがある。(名詞として使う。) 例えば、標準入力先を[指定する・変更する・パイプする・リダイレクトする] 標準入力先に入力する。(現在標準入力(0)に指定されている経路に向けて) その経路先にデバイスファイルがあれば、オペレーティングシステムにデータが届けられる。 標準入力とは暗黙(標準)的に入力に使用される、あるファイルに対して書き込みするためのデータの経路を指すもの。 各プログラムの標準入力は、プログラム起動に先駆け(前)て『入出力を司るオブジェクト』の内の一つとして親のものがそっくり継承される。 あるファイルの'ある'とは通常ファイルでもスペシャルファイルでもファイルであれば何でも良いが、 親のものが継承されるため、その親にデフォルトで何が指定されるかは依存しており、 例えばbashプロセスでlsコマンドプロセスを立ち上げると、bashプロセスの子プロセスとして立ち上がり、 その子プロセスの立ち上げに先駆けてそっくり親(bash)のfdが継承される。 デバイスファイルを画面ファイルと捉えるべきではないという点におきましては、 ファイルシステム内に保持している情報は「デバイス番号」という管理情報のみという部分の理解により、確かにそう捉えるべきではないと納得いたしました。 最後、に頂きました資料(シェルでの対話処理の典型)は非常にわかりやすく、更に理解が深まりました。 一点どうしてもわからないことがございまして画像上下のパソコン中央の、 コマンド実行完了待ち:コマンド完了次コマンド待ちという上下を繋ぐ矢印の部分は何を意味するものでしょうか? 理解力不足で申し訳ございません。
angel_p_57

2022/01/23 03:06

> 一般的な言語の継承関係で考え、オブジェクト(fdをラップする)をクラスと考えると.. > クラスが継承される形で、どんどんと(子)クラス(=子プロセス)を作成されていく。 勝手に「言語の継承関係」持ち出しちゃダメですよ。単に「引き継ぎます」というのを「継承」という単語で言ってるだけのところ、文脈を無視して専門用語扱いするのは、技術的な文章を読む上で大きなトラブルを招きかねませんから。 ※それに「接続状況を継承」と言っていて、「オブジェクトが継承関係にある」ではないですよ > 実行結果を基にした例として、 こちらの例での把握はある程度良いと思うのですが… > 実行後は変更が破棄され、pythonプログラムの標準出力先が元の状態に戻り 「破棄」とか「戻る」なんて説明、私一切してないはずです。書いてない内容を勝手に読み込んではダメです。 ※標準入力/出力/エラーはプロセス毎に持っているので、プログラムが起動した後にお互いに干渉したり、それがもとで「戻る」なんてことにはなりません。 > 一つ不安な点は、 「一時的」という、書いてない内容を持ち込むのを止めましょう。 ※理解のために詳細に踏み込むのは悪手です。まずは「簡単な内容のまま」把握し、その裏付けとして詳細を補強していくようにしないと、どんどん情報に押し流されて理解が捩れます > コマンド実行完了待ち:コマンド完了次コマンド待ちという上下を繋ぐ矢印の部分は何を意味するものでしょうか? 「状態の変化」と見てください。「コマンドを実行してシェルが完了待ち状態になると下のような図になっている、コマンドが完了して次のコマンドが入力されるのを待つ状態に戻ると上のような図に戻る」ということです。
akiyama3284pga

2022/01/23 06:49 編集

ご指摘頂きありがとうございます。 継承という部分に大変な誤解をしておりました。 継承と、プロセスへの理解訂正 ---------------------------------------------------------------------------------------------------- 最初に頂いた文の中で、プロセスについては単純に「プログラムの実行単位」 という部分があり、これを自分の中で前提において理解を進めていたはずが、いつのまにか継承という言葉を自分の勝手なものにして理解したがために全く別のものに すり替わり、それが元で理解に大きな狂いを生じさせてしまっていた。 全てのプログラムは個々の全く別のプロセスとして管理されるため、 例えば同じmy.pyスクリプトでも2回起動すれば、それらのプロセスの関係性は皆無であり、 それぞれが起動時(前)に親のfdの接続状況を受け継ぎ、当然それぞれのプログラム内で起動するlsプロセスも、 全く別のプロセスにある親から受け継ぐ。 プロセスは上下には関係があるが、横のつながりは少なくともfdの受け継ぎという点では全く無い。 出力リダイレクトでは実際にfdの1を他ファイルに(繋ぎ)変えるので、戻るという概念は出るはずがない。 プロセスは実行後に破棄されるが、これと自分が上で書いた破棄の指す対象が別物で、そこがおかしかった。 繋ぎ変えられた親プロセスで起動するls子プロセスも当然親プロセスのfdの接続状況を受け継ぐ。 だから出力がそのファイルになっている。 どこかのサイトで読んで何となく頭に残っていた部分を、自分の都合の良い方向に考える材料としていた.. 親の変更が子に反映されるよくある言語のクラスの概念での継承と混同すると、この文脈で意味する継承とは全く別物となり、大きな誤解を生む。 上のような理解の仕方をするから、一時的などといった誤った概念も出てきてしまう。 ----------------------------------------------------------------------------------------------------------- 図の解釈が至らず申し訳ございません。 こちらに関しまして理解することができました。 日本語に翻弄されず、常に文脈からその意味を正しく抽出・解釈し、その本質部分を見いだせるような思考法を身に付け無ければ、多くの理解の時間を生むどころか、ドミノ倒し的に理解の全体が崩れてしまうのだと痛感いたしました... 貴重なお時間をこのような馬鹿者に割いて頂き、感謝しております。<(_ _)>
guest

0

ベストアンサー

Bashを特別扱いしているのと、initの位置づけがおかしい以外は、全般的に大きな間違いは無いです。

・デバイスファイル(スペシャルファイル)について

/dev/tty1などとお書きの物は/dev/pts/1などの間違いでしょうね。

Bashシェルが起動した際、その起動したものに1:1で特定できるように作成され、

/dev/pts/1が出来るのはBash起動前。/dev/pts/1 は、/dev/pts/ptmx (/dev/ptmx) をオープンすると作られる。

・プロセスについて

bashを立ち上げるとそのタイミングではinit__bashという形となっている。

ps の出力を見ればすぐわかるのですが、Bashはinitの子プロセスではないです。ずっと子孫。
Bashの親プロセスは、ssh接続の場合は sshd、コンソールからのCUIログインなら login、GUIでログインして端末を開いた場合は端末ソフト(端末エミュレータ)です。

全てのプロセスがどれかのbash(デバイスファイル=tty)に紐づいているという訳ではなく、

Bashとttyに特別の結びつきはないので、この文脈でbashが登場するのはおかしい。
シェルと無関係なプロセスに結びついた端末もあり得ます。

・デバイスファイルとプロセスとfdと標準入出力、標準エラー出力の関係について

全てのプロセスには、必ずfd:0, fd:1, fd2が自動でセットされる。

ファイルディスクリプタは、プロセス生成時に親プロセスのものがコピーされます。
0 1 2 が全部有るとは限りませんし、もっとあるかもしれない。

投稿2022/01/20 13:10

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/01/20 14:04 編集

ご指摘とご訂正ありがとうございます。 おおまかには合っているようで、安心いたしましたと共にまだまだ理解ができていない点があるようで、少しずつ修正していきたいと存じます。 以下の大きくは2点につきまして再度質問を申し訳ございません。<(_ _)> 自分のwsl環境でttyしますと、立ち上げたシェルの毎に/dev/tty1, /dev/tty2...と表示されます。 この挙動から自分はローカル環境でのデバイスファイルは/dev/tty1...となるという風に認識いたしまして、 sshで接続した場合はttyしますと、/dev/pts/1...と表示されますことからこのような認識となっております。 https://www.tweeeety.blog/entry/2014/05/23/175129 こちらのサイト様で書かれているものを参考にしているのですが、自分の理解ミスが生じているということでしょうか? また、自分の環境におきましてps -a --forestした場合、 7 tty1 Ss 0:00 /init 8 tty1 S 0:01 \_ -bash 354 tty1 T 0:00 \_ python 355 tty1 Z 0:00 | \_ [ls] <defunct> 779 tty1 T 0:00 \_ top このような表示となりました。 ですので文中のような認識となっております。 この場合もっとinitとbash間には多くのプロセスが介在しているが省略されているということでしょうか? いつも大変ご迷惑をお掛けいたします。
angel_p_57

2022/01/20 14:05

> /dev/tty1などとお書きの物は/dev/pts/1などの間違いでしょうね。 /dev/tty1 なんかは普通にデバイス名としてありますよ。 ただ、実機なりVMにインストールした場合は仮想コンソールの数に応じて予め作られますが、手元のWSL1だとwslコマンドでセッション作る毎に /dev/tty1,2,… とデバイスファイルが作られてます。そのことを言ってるのではないでしょうか?
otn

2022/01/20 14:29 編集

> 自分のwsl環境でttyしますと、 wsl1でしょうか?私もwsl1を使ってますが、これはLinuxのコマンドが使えるだけでLinuxじゃないので。 Linuxだと/dev/tty1等は、コンソールに割り当てられていると思います。動的には増えないはず。 私の回答はLinux前提です。 bashがinitの子プロセスというのもwsl1の話ですね。 Linuxの勉強をしたいのであれば、 wsl1 でなく wsl2 (あるいはVirtualBoxやVMWare) でLinuxを入れましょう。
otn

2022/01/20 15:08 編集

> おおまかには合っているようで、 表現がいろいろおかしいので、そこを掘ると理解の間違いが見つかるかもしれません。 すでに書いた以外だと、 > デバイスファイルというのは、仮想的(ソフトウェア)に入力と出力を実現させる機構を備えたプラットフォームのようなもので、キーボードを標準入力、ターミナル画面を標準出力という構造の中身を気にしなくていいようにしてくれている。 > (SSH接続時も同様) > (sshの場合は許可が当然必要) > 某サイト様ではデバイスファイルのことを画面ファイルと表現されており、これは個人としてはしっくりきた。 > linuxにおいては全て(コマンド、ファイル実行...)はプロセスが起動し、プロセス毎に管理される。 > 大元最上位に来る親がubuntuではinit(=systemd) > bashプロセスでlsと打つことができる(標準入力)し、もし仮にlsが何らかの入力を求めるものだったとしたら、そのlsプロセスにも標準入力することができるし、 > その結果が画面ファイル(デバイスファイル)へと表示される(標準出力)。
akiyama3284pga

2022/01/20 15:27 編集

ありがとうございます。 otn様のおっしゃりました点が理解できました。(本当に?) 先ほど、vmでcentosを入れてttyを実行した結果、 CUI => /dev/tty1 GUI => /dev/pts/1 という求めておりました結果を手にすることができました。 CUIモードから別サーバへssh接続した場合も/dev/pts/1と表示されました。 このような結果から、GUIモード時の端末のデバイスファイルとssh接続した時のデバイスファイルは同じ /dev/pts/... ということがわかりました。 /dev/pts/には接続しているユーザのデバイスファイルが置かれるので、それがデバイスファイルに指定されているということは、 GUIモード時の端末というのはssh接続時と同じ、所謂ターミナルエミュレータで、GUIモード時の場合では大本のCUIモード時のあのコンソールをエミュレートしている。 それをするために、 /dev/pts/1 は、/dev/pts/ptmx (/dev/ptmx) をオープンすると作られ...という流れが出て来る。 そして2つ目の点もいろいろなプロセスが介在されているのが確認いたしました。 このような理解に至りました。 wsl1においてbashを起動すると/dev/tty1のように出るということは、純粋なLinuxのCUIで切り替える仮想コンソールと同義なのかと思いましたが、wsl1では6個以上bashを立ち上げられるため同じものと捉えてよいものか迷いが生じました。この場合のデバイスファイルは一体 これに関しましては相当に見当違いなことを言っていると思います。
otn

2022/01/21 15:47

概ね合っているように思えます。 参考としては、man 4 tty や man 4 console 、man 8 agetty など。 wsl1については、Windowsカーネルに一皮かぶせてLinuxのシステムコール(の一部?)をエミュレートするようにしてあるわけですが、ちゃんと考えたことないので、すぐわかること以上のことはよくわかりません。
akiyama3284pga

2022/01/22 01:58 編集

遅くなり申し訳ございません。 いろいろと教えてくださりありがとうございます。<(_ _)> これから言われております、man 4 tty や man 4 console 、man 8 agettyなど勉強したり、 参考書なども読み漁りつつより深く理解できるよう精進して参ります。 wsl1に関してはあまり深入りせず、今のところはそっとしておきたいと存じます。
guest

0

/procつまりプロセスがファイルであるというのが抜けているように思います。

投稿2022/01/20 09:03

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akiyama3284pga

2022/01/20 12:09

御回答いただきありがとうございます。 その通りで、プロセスもファイルだという認識ができておりませんでした。 それを踏まえた場合どこか文中おかしな点などあれば教授頂けましたら幸いです。<(_ _)>
angel_p_57

2022/01/20 14:01

流石に「プロセスがファイル」は乱暴でしょう。 /proc は、あくまで「プロセス状況(等)」の情報を反映するファイルシステムとして用意されてる、というだけで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問