FreeBSDで、同じハードリンク同士の片方をもう片方にmvしても両方残るのは仕様?

$ touch foo1; ln foo1 foo2 $ mv foo2 foo1 $ ls foo* foo1 foo2 になる件について。
34
前へ 1 2 ・・ 5 次へ
切り取り線 @cuthereline

@satoh_fumiyasu ここの議論が興味深いです。https://t.co/xeiI99EEIP この議論で出てきている「POSIXの2のa」というのは多分mvコマンドの項目のことを指しているんだと思います。→http://t.co/Iq4ojQ8Co8

2013-10-17 23:20:11
切り取り線 @cuthereline

@daichigoto 確かに。http://t.co/jAGWAp7XbYの3577行あたりを見るとrename(2),renameat(2)の仕様っぽいですね。ディレクトリなvnodeに対してやられることを想定してるのかしらん。

2013-10-17 23:36:18
切り取り線 @cuthereline

@bsdhack 全くの勘ですが、派生なような気がします。いろいろ見回すと違うようで同じところがあって、昼間にツイートしたこの挙動 https://t.co/O46Zr6jhZt なんかも、この2者にも共通して起こるんですよ。

2013-10-17 23:40:32
SODA Noriyuki @n_soda

@uspmag @satoh_fumiyasu ああああ、ご推察の通り、mv(1)のページです>「POSIXの2のa」 リンク張り間違えました。orz

2013-10-17 23:48:35
Hiroki Sato @Hiroki_Sato

@n_soda @_enami @syuu1228 FreeBSDは、rename(a,b) とrename(b,a) が違うプロセスでほぼ同時に発行された時のraceを嫌ったのが変更の動機です。そもそもSUSv4以前は 2.b, 2.cの挙動は記述がなかったような記憶が。

2013-10-18 08:41:06
MAEKAWA Masahide @cvsync

@Hiroki_Sato @n_soda @_enami @syuu1228 SUSv3 には、そもそも SUSv4 の 2 に該当するものがまるまるありません。

2013-10-18 10:52:01
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 ホントだ。SUSv4: http://t.co/7faPTIkdJr SUSv3: http://t.co/AGICkWPTgv Solaris がSUSv3違反だったとは、この仕様SVID由来かしら

2013-10-18 12:04:28
SODA Noriyuki @n_soda

@Hiroki_Sato @_enami @syuu1228 raceの問題はカーネル内なら避けられそうな気がするんですが、何か、ロックが面倒とかいった事情があるのでしょうか?

2013-10-18 12:05:30
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 ちなみに、Solaris が SUSv3 違反だとなるのは、どれに合わないからでしょうか?

2013-10-18 13:41:51
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 ああああ、すいません。SUSv3 の「mv shall write a diagnostic message to standard error」を見逃してました。

2013-10-18 13:59:38
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 と思ったけど、「If this fails」が「rename(2)が-1を返す」という意味であれば、「mv shall」は当てはまりませんね。そっちの方が自然か。

2013-10-18 14:04:42
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 で成功時の診断表示について、v3に特に規定はないので、「SUSv3 には 2.b, 2.cの記述がなかった」ではなく、「SUSv3の2.は、v4の2.aと2.bの意味だった」ってこと?規格ムズカシイです

2013-10-18 14:08:25
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 ん?SUSv3 の 2 は「mv(1) は rename(2) を以下のように呼び出したのと同じ挙動をしなさい。成功失敗ほげほげ」なのだから Solaris もおかしくないと思ってますが。

2013-10-18 14:25:16
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 ほいでもって SUSv3 の 2 は SUSv4 の 3 に残っているわけで、「(略)SUSv4 2.a と 2.b の意味だった」も違うんでは?

2013-10-18 14:27:51
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 僕のさっきのが勘違いで、Solaris 9はSUSv3に違反してる気がします。Solaris 9だと、SUSv4の2.bにある「diag表示して、何もしない」ので、 rename(2)と挙動が違うので。

2013-10-18 14:29:56
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 SUSv3 の 2 だけを見れば、rename(2) が成功していてかつ diag 表示しても問題はないし、rename(2) が失敗したから、diag 表示して、何もしなかったであっても問題ない。

2013-10-18 14:35:56
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 Solarisのソースまでは確認してないですが、Solaris 9の場合、mv(1)はPOSIX rename(2)とは違う処理してます。つまり、たぶんrename(2)呼んでないんです。

2013-10-18 14:38:21
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 呼んでなくてもいいじゃん。こう呼んだのと同じ動作をしろ、としか書いてない。で、知りたいのは Solaris 9 の rename(2) を読んだら消えるのかどうか、です。

2013-10-18 14:40:16
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 一番最初の頃のツイートに書いたですが、消えません。つまりrename(2)は、POSIX仕様です。

2013-10-18 14:43:53
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 ソース読まなくてもtruss(1)があるじゃないってことを思い出したので試してみたのですが、この場合lstat64("foo1")→lstat64("foo1")→lstat64("foo1")でした。

2013-10-18 14:45:07
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 で、この場合、lstat64()だとraceを完全に避けることはできませんから、(raceを避けられる)rename(2)とは、厳密に言うと挙動が違います。

2013-10-18 14:45:55
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 raceのことは気にしないってことにすると、確かにSolaris 9もSUSv3に適合するかもしれません。ただし、その場合は、SUSv3のmv(1)の仕様は、v4の2a+2bという意味となるかと。

2013-10-18 14:48:02
MAEKAWA Masahide @cvsync

@n_soda @Hiroki_Sato @_enami @syuu1228 見直したけど分からない。mv(1) は消える消えない? rename(2) は消えるんだから、mv(1) で消えなければ違反。消えれば「違反と言われる筋合いはない!」で FA。SUSv4 は話が違う。

2013-10-18 14:52:18
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 あ、また間違えたので、消して書き直します。

2013-10-18 14:56:57
SODA Noriyuki @n_soda

@cvsync @Hiroki_Sato @_enami @syuu1228 「mv(1)は消えない。警告出す」「rename(2)も消えない」です。(x)警告出す出さないは書いてないなら無関係 (y)raceは無視 であれば、Solaris 9もSUSv3合致ですか。

2013-10-18 14:59:14
前へ 1 2 ・・ 5 次へ