回答編集履歴

3

さらにスメルを感じた

2015/07/08 09:14

投稿

ngyuki
ngyuki

スコア4514

test CHANGED
@@ -63,3 +63,29 @@
63
63
  `LOCK_UN` はせずに fclose での(カーネルによる)暗黙のアンロックに任せるか、flock の前に fflush する必要があります。
64
64
 
65
65
 
66
+
67
+ ---
68
+
69
+
70
+
71
+ ```lang-php
72
+
73
+ $old_file = fopen('bbs.dat', 'rb');
74
+
75
+ $new_file = fopen('bbs.tmp', 'wb');
76
+
77
+ flock($old_file, LOCK_SH);
78
+
79
+ flock($new_file, LOCK_EX);
80
+
81
+ ```
82
+
83
+
84
+
85
+ ここも危険な香りがします。
86
+
87
+
88
+
89
+ `bbs.tmp` は新規ファイルだから `wb` で開いて大丈夫だと思って参考書はそうなっているのでしょうけど、このプロセスが2本同時に実行されたら、1本目のプロセスが作成した `bbs.tmp` を2本目のプロセスが上書きしてしまう可能性があります。
90
+
91
+

2

fclose の補足

2015/07/08 09:14

投稿

ngyuki
ngyuki

スコア4514

test CHANGED
@@ -60,6 +60,6 @@
60
60
 
61
61
  この部分とかとても危険です、flock から fclose までに無防備な時間があります。
62
62
 
63
- `LOCK_UN` はせずに fclose による暗黙のアンロックに任せるか、flock の前に fflush する必要があります。
63
+ `LOCK_UN` はせずに fclose での(カーネルによる暗黙のアンロックに任せるか、flock の前に fflush する必要があります。
64
64
 
65
65
 

1

追記

2015/07/08 09:08

投稿

ngyuki
ngyuki

スコア4514

test CHANGED
@@ -33,3 +33,33 @@
33
33
 
34
34
 
35
35
  どのような参考書をお使いなのかわかりませんが、このような質の低いコードがサンプルとして記載された参考書は参考にしないほうが良いと思います。
36
+
37
+
38
+
39
+ ---
40
+
41
+
42
+
43
+ 質問と直接関係ありませんが。。。
44
+
45
+
46
+
47
+ ```lang-php
48
+
49
+ flock($new_file, LOCK_UN);
50
+
51
+ flock($old_file, LOCK_UN);
52
+
53
+ fclose($new_file);
54
+
55
+ fclose($old_file);
56
+
57
+ ```
58
+
59
+
60
+
61
+ この部分とかとても危険です、flock から fclose までに無防備な時間があります。
62
+
63
+ `LOCK_UN` はせずに fclose による暗黙のアンロックに任せるか、flock の前に fflush する必要があります。
64
+
65
+