Problem with line buffering and getc function on 1.7.33.

Kaz Kylheku 920-082-4242@kylheku.com
Sat Mar 12 00:05:00 GMT 2016


On 11.03.2016 14:14, Marco Atzeri wrote:
> On 11/03/2016 22:57, Kaz Kylheku wrote:
>> On 11.03.2016 12:08, Yaakov Selkowitz wrote:
>>> On 2016-03-11 13:16, Kaz Kylheku wrote:
>>> 
>>>> On a Cygwin installation version 1.7.33-2(0.280/5/3), I encountered
>>>> an odd issue.
>>> 
>>> This is a 15-month old release which is no longer supported. Please
>>> update to 2.4.1.
>> 
>> Do you mean, "Please update to 2.4.1, it is fixed there!"
>> or do you mean "You haven't done enough with that minimal
>> C repro case; please keep investigating against
>> the latest code?"
> 
> #2 please verify if the issue is still present in the last code.
> We don't have the bandwith to check claims on older release.
> on 2.4.1 the output is:
> 
> $ ./test_stream.exe
> received REQUEST
>  from client
> received
>  from server

That confirms that the issue is still there.

We can reproduce the problem with just file streams using
a much simpler program:

#include <stdio.h>

int main(void)
{
   FILE *out = fopen("file", "w+");
   setvbuf(out, (char *) NULL, _IOLBF, 0);
   getc(out);
   clearerr(out);
   fseek(out, 0, SEEK_SET);
   putc('a', out);
   putc('b', out);
   putc('c', out);
   putc('d', out);
   putc('e', out);
   putc('\n', out);
   fclose(out);
   return 0;
}

The contents of file end up being "\n": one empty
line, instead of "abcde\n":

   $ cat file

   $

The necessary ingredients seem to be: open the stream for update;
put into line buffered mode; do some input. In this program,
replacing putc with fputs doesn't make the problem go away;
the workaround isn't working:

   fputs("a", out);
   fputs("b", out);
   fputs("c", out);
   fputs("d", out);
   fputs("e", out);
   fputs("\n", out);

However, if we do it as one string, then the file does contain
the correct line:

   fputs("abcde\n", out);

This sequence also gets us correct file contents:

   fputs("ab", out);
   putc('c', out);
   putc('d', out);
   putc('e', out);
   putc('\n', out);

HOWEVER, these distracting effects are because GCC is
optimizing one-character fputs calls into _fputc calls.
Annoyingly, this happens even with gcc -O0.

The clearerr and fseek calls are red herrings; they seem to make
make no difference. I put in the fseek for formal ISO C compliance:
ISO C says that before performing an output operation on an update
stream whose last operation was input, we "shall" perform a
positioning operation. (No sanely implemented libc actually
breaks code that doesn't meet this silly requirement.)





--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list