
At 18:14 16/03/04 +0000, Ross Paterson wrote:
It could well be Hugs. In this situation it calls fdopen(fd, "w+"), but I think it should be fdopen(fd, "w").
Ah... in "iomonad.c", I see: [[ static String local modeString(hmode,binary) /* return mode string for f(d)open */ Int hmode; Bool binary; { if (binary) { return (hmode&HAPPEND) ? "ab+" : (hmode&HWRITE) ? "wb+" : (hmode&HREADWRITE) ? "wb+" : (hmode&HREAD) ? "rb" : (String)0; } else { return (hmode&HAPPEND) ? "a+" : (hmode&HWRITE) ? "w+" : (hmode&HREADWRITE) ? "w+" : (hmode&HREAD) ? "r" : (String)0; } } ]] I tried changing w+ to w, and wb+ to wb for the write-only modes, thus: [[ static String local modeString(hmode,binary) /* return mode string for f(d)open */ Int hmode; Bool binary; { // printf("Access mode %i,%i\n",hmode,binary) ; // [[[GK]]] if (binary) { return (hmode&HAPPEND) ? "ab+" : (hmode&HWRITE) ? "wb" : // [[[GK]]] (hmode&HREADWRITE) ? "wb+" : (hmode&HREAD) ? "rb" : (String)0; } else { return (hmode&HAPPEND) ? "a+" : (hmode&HWRITE) ? "w" : // [[[GK]]] (hmode&HREADWRITE) ? "w+" : (hmode&HREAD) ? "r" : (String)0; } } ]] But the result is the same: [[ SpawnEchoShiftLetters> runTest wIn 3 Access mode 4,0 Program error: openFd: does not exist (file does not exist) SpawnEchoShiftLetters> ]] (The access mode trace was mainly to prove to myself that my changes were indeed being picked up. The value 4 is equal to HWRITE.) So this (alone) is not enough. I did also try using "a" and "ab", but no joy there, either. This starts to point to some interaction between the I/O library and Windows anonymous pipe. My C code (which works as expected) uses the _write function (equiv. Unix "write") directly on the returned file descriptor. #g ------------ Graham Klyne For email: http://www.ninebynine.org/#Contact