私はZshモジュールを書いています。私はZshコマンドにマップされた組み込み関数を持っています。 oconf
構造を取得し、その後、スレッドが生成されるdup(fileno(stdin))そして32スレッドの生成 - >入出力エラー
/* Duplicate standard input */
oconf->stream = fdopen(dup(fileno(stdin)), "r");
:この関数は、標準入力ファイル記述子を複製します。そのスレッドでは、私が行います
errno = 0;
/* Read e.g. 5 characters, putting them after previous portion */
int count = fread(buf + index, 1, read_size, oconf->stream);
/* Ensure that our whole data is a string - null terminated */
buf[ index + count ] = '\0';
if (errno) {
fprintf(oconf->err, "Read error (descriptor: %d): %s\n", fileno(oconf->stream), strerror(errno) >
}
私はzshの中に32件のスレッド産卵場合:2-3次に
for ((i=1; i<=32; i ++)); do
ls -R /Users/myuser/Documents | mybuiltin -A myhash_$i $i
done
をスレッドは例えば、上記fprintf()
から報告されたI/Oエラーがあります。
読み取りエラー(記述子:7):入力/出力エラー
読み取りエラー(記述子:5):デバイスのための不適切IOCTL
読み取りエラー(記述子:14):デバイス
ための不適切なioctlのデバッガは、それらのスレッドは、複数の(5-20)のfread()繰り返した後、カーネルの__read_nocancel()
にブロックされ得ることを述べています。だから、本当に悪いことがファイル記述子で起こっています。
これ以外の場合は、これが機能します。パイプは正しくls -R
のデータを渡し、カスタムの組み込み関数によって読み取られます。それで危険はどこですか?どのようにしてdup()
がメインスレッドで実行されると、何かが読めなくなりますfread()
?二次スレッドでdup()
を実行するかどうか疑問に思うかもしれません。しかし、私はそれを安全な場所にとどめておきます。メインスレッドは、FILE *
ストリームをセカンダリスレッドに渡します。また、POSIX open()
、read()
およびclose()
で試してみると、結果は同じです。