Search code examples
cfile-iobufferfgets

Sensible line buffer size in C?


I'm using popen to read output from shell commands. I will use fgets to read line by line. My question is how to choose the best buffer size for my char* buffer? I remember from a professor telling us to include <limits.h> and use LINE_MAX for such things. It works fine on my Mac, but there's no LINE_MAX on Linux.

This mailing list archive poses the same question, but no answer to my question http://bytes.com/topic/c/answers/843278-not-able-locate-line_max-limits-h


Solution

  • When <limits.h> does not define LINE_MAX, look at _POSIX2_LINE_MAX, which is required to be at least 2048. I usually use 4096.

    Also look for the (new) POSIX functions getline() and getdelim() - both at the same URL. These allocate memory as necessary.


    Program (posix2_line_max.c)

    #include "posixver.h"
    #include <limits.h>
    #include <stdio.h>
    
    int main(void)
    {
      printf("%d\n", _POSIX2_LINE_MAX);
      return 0;
    }
    

    Output:

    2048
    

    posixver.h

    #ifndef JLSS_ID_POSIXVER_H
    #define JLSS_ID_POSIXVER_H
    
    /*
    ** Include this file before including system headers.  By default, with
    ** C99 support from the compiler, it requests POSIX 2001 support.  With
    ** C89 support only, it requests POSIX 1997 support.  Override the
    ** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
    */
    
    /* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
    /* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
    /* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */
    
    #if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
    #if __STDC_VERSION__ >= 199901L
    #define _XOPEN_SOURCE 600   /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */
    #else
    #define _XOPEN_SOURCE 500   /* SUS v2, POSIX 1003.1 1997 */
    #endif /* __STDC_VERSION__ */
    #endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */
    
    #endif /* JLSS_ID_POSIXVER_H */
    

    Tested on an Ubuntu 12.04 derivative; command line:

    gcc -g -O3 -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Werror  posix2_line_max.c -o posix2_line_max