トップページ > Linux > 2018年11月09日 > 3WMswF4A

書き込み順位&時間帯一覧

6 位/139 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000001102120000007



使用した名前一覧書き込んだスレッド一覧
login:Penguin
984
【Bash】Windows Subsystem for Linux【WSL】3

書き込みレス一覧

【Bash】Windows Subsystem for Linux【WSL】3
984 :login:Penguin[]:2018/11/09(金) 12:48:55.28 ID:3WMswF4A
-OyomiオプションつきでWSL版mecabで開いた状態だと、Windows版mecabで同じ辞書フォルダを開けない。
Windows側でCreateFile()の共有指定をFILE_SHARE_READからFILE_SHARE_READ | FILE_SHARE_WRITEに変更して再ビルドすることで回避できた。
同じ問題が、いろんなアプリで起きそうな予感。

WSLで読み取りで開いているファイルにアクセスできないWindowsアプリとか潜在的に多そう。
ちなみにMSのCライブラリだとfopen(filename, "r") でFILE_SHARE_READ | FILE_SHARE_WRITEが指定されるので大丈夫。
CreateFile()というWindows固有のWin32APIを直接呼び出すコードで問題が起きる可能性がある。
読み取りで開くからといって共有指定をILE_SHARE_READ | FILE_SHARE_WRITE ではなくFILE_SHARE_READだけにするとハマる。
【Bash】Windows Subsystem for Linux【WSL】3
986 :984[]:2018/11/09(金) 13:51:52.09 ID:3WMswF4A
説明補足。Mecabは、オープンソース 形態素解析エンジン。
以下URLが公式。多分。
http://taku910.github.io/mecab/

>>984 で再ビルドしたってのはソースを修正してmecabバイナリ群をリビルトしたという意味。
CreateFile()を呼び出している箇所は一ヶ所だけなので修正はさほど手間ではない。

開発者の方には、そろそろMecabの最新版を公式リリースしてもらいたい。64bit対応とかあるだろうし。
なお、Mecabの最終更新が2013-02-18と5年以上前。

Mecabに限らず、WSLとWindowsで同時にファイルを開くアプリは要注意。
Bzという割とメジャーなバリナリエディタもCreateFile()の共有指定がFILE_SHARE_READだけなので同じ現象が起きる。


この件、WSLの仕様がおかしいようにも思える。
【Bash】Windows Subsystem for Linux【WSL】3
991 :login:Penguin[sage]:2018/11/09(金) 15:03:07.22 ID:3WMswF4A
>>988
書き込み側、読み込み側、どちらかが優先されるべきかは
それはアプリ次第であって、こうすべきと決めつけるものでもないでしょう。
起動中の読み取りアプリを犠牲にしてでも書き込み優先するという割り切り方もある。

>>990
後学のためにmecabをインストールしてみては?
【Bash】Windows Subsystem for Linux【WSL】3
993 :login:Penguin[sage]:2018/11/09(金) 15:34:43.90 ID:3WMswF4A
>>992
以下のプログラムをWSLでコンパイルし、第一引数に開きたいファイルパスを渡して実行してください。
次に、Windows側で同じファイルをBzで開こうとすれば再現します。なお、当方は64bit版Windows10。
使っているWSLはUbuntu 18.04.1 LTS

#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
const char* filename = argv[1];
int fd = ::open(filename, O_RDONLY);
int prot = PROT_READ;
char *p = reinterpret_cast<char *>(::mmap(0, 1024, prot, MAP_SHARED, fd, 0));
printf("%s %d %p\n", filename, fd, p);
fputs("input [ENTER].\n", stdout);
fgetc(stdin);
::close(fd);
fputs("bye.", stdout);
return 0;
}
【Bash】Windows Subsystem for Linux【WSL】3
997 :login:Penguin[]:2018/11/09(金) 16:03:18.95 ID:3WMswF4A
>>988
> えとさ、安全かどうかでちゃんと考えてる?

たかが読み取りオンリーなプログラムの分際で、自分の安全しか考えない身勝手なプログラムはダメでしょう。
読み取り側が排他ロックしたい時だけロックするべきで、それ以外の時は書き込み側を優先するのが基本でしょう。
【Bash】Windows Subsystem for Linux【WSL】3
999 :login:Penguin[sage]:2018/11/09(金) 17:09:55.48 ID:3WMswF4A
スキルの低い人ほど宗教的な信条を他人に押し付けたがる法則
【Bash】Windows Subsystem for Linux【WSL】3
1000 :login:Penguin[]:2018/11/09(金) 17:10:47.97 ID:3WMswF4A
スキルの低さを宗教的な信条で補っているともいえる。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。