Skip to content

Posts

開いたままのファイルを削除したらどうなるか2

昨日のCパターンを実際にAWSで試してみた。Docker関係なかった。

  • Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume TypeMicrosoft Windows Server 2019 Baseのインスタンスをt2.microでそれぞれ作成
  • Linux側からWindows側へのセキュリティグループからのアクセスを許可

Windows側

  • C:\Users\shared を作成してプロパティから共有設定

Linux側

  • Windowsの共有フォルダをマウントしてテスト用ファイル作成
$ sudo yum install cifs-utils
$ sudo mkdir /mnt/shared
$ sudo mount -t cifs //<WindowsのIP>/Users/shared /mnt/shared -o user=Administrator
$ ls /mnt/shared/
$ sudo mkdir /mnt/shared/test
$ sudo vi /mnt/shared/test/test.txt
  • Goのインストールとオープンして待機するプログラムの実行
$ sudo su
# rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz
# exit
$ export PATH=$PATH:/usr/local/go/bin
$ go version
go version go1.18 linux/amd64
$ sudo yum install git
$ git clone https://github.com/umemak/open_file_delete_test.git
$ cd open_file_delete_test
$ sudo /usr/local/go/bin/go run main.go /mnt/shared/test/test.txt
  • Linux側別コンソールでファイル削除など確認
$ sudo lsof | grep test.txt
main      3916                root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt
main      3916 3917           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt
main      3916 3918           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt
main      3916 3919           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt
$ ls -l /mnt/shared/test/
total 1
-rwxr-xr-x 1 root root 7 Mar 31 04:51 test.txt

$ sudo rm /mnt/shared/test/test.txt
$ sudo lsof | grep test.txt
main      3916                root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt (deleted)
main      3916 3917           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt (deleted)
main      3916 3918           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt (deleted)
main      3916 3919           root    3r      REG               0,40         7 1688849860265148 /mnt/shared/test/test.txt (deleted)

$ ls -l /mnt/shared/test/
total 1
-rwxr-xr-x 0 root root 7 Mar 31 04:51 test.txt

$ cat /mnt/shared/test/test.txt 
cat: /mnt/shared/test/test.txt: No such file or directory
  • Goプログラム終了
$ ls -l /mnt/shared/test/
total 0

開いたままのファイルを削除したらどうなるか

ホストがマウントしたディレクトリをマウントしたコンテナでプロセス1で開いてクローズせずにプロセス2で削除したあとその他のプロセスからファイルはどう見えるか。

A. ファイルは削除されディレクトリにもリストされない

B. ファイルは削除できない

C. ファイルは削除されアクセスできないがディレクトリにリストされたまま

プロセス1がつかんだままなので削除できないかと思いきや、削除できてしまう。

Read more

mdmml_rust

Vecの使い方を理解した気がする。

これでどうにかSMFのバイナリを組み立てられるのではないだろうか。

mdmml_rust

Rust版を少し進めた。

こういうときはこう書けばよい、というのが身についていないのでなかなか進まない。

mdmml機能追加

ローカルファイルだけではなく、URL指定で読み込みできるようにしてみた。

issue立てておいたのにPRせずにmaster直PUSHしてしまった。。

実践Rustプログラミング入門

Cargoについて学んだ。

Goはgoコマンドでビルドもテストも外部モジュール管理もするけど、Rustはそうではないらしい。

というかrustコマンドが存在していない?rustcはあるけど。

実践Rustプログラミング入門

クレートとモジュールについて学んだ。

しかし、なんでクレートなんて名前にしたのだろう。名前から機能がイメージできない。

ファイル名がそのままモジュール名になるのは良いと思う。 Goはディレクトリ名がパッケージ名だけど、その中のファイル名はパッケージ名と一致していなくてもよいので、紛らわしい名前でも付けようと思えばつけられてしまうのがちょっと。

Read more

実践Rustプログラミング入門

マルチスレッドについて学んだ。

メッセージパッシングはGoより分かりやすいかも(矢印の書き方いつも忘れる)。

非同期処理について学んだ。

async/awaitはReactとかFlutterで雰囲気で使っていたけど、ちょっと理解が進んだ気がした。

実践Rustプログラミング入門

読み進めていく。

別にこの本のせいではないのだけれど、、

マクロ、最後に!が付くのがちょっと落ち着かない(否定っぽい感じ)。

トレイトが何者かすぐ忘れてしまう。

implはGoでいうところのメソッドだというのはわかった。

Boxもすぐ忘れそう。。