Sensitive line buffer size in C?

I use 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 how the professor told us to include <limits.h> and use LINE_MAX for such things. It works fine on my Mac, but there is no LINE_MAX for Linux.

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

+4
source share
5 answers

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

Also look for the (new) POSIX functions getline() and getdelim() - both with the same URL. If necessary, they allocate memory.


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; } 

Conclusion:

 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 derived Ubuntu 12.04; command line:

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

man getline

Also see http://www.gnu.org/s/libc/manual/html_node/Line-Input.html and a discussion of getline() vs. fgets() vs. gets() . Subject on SO more often than I can count on.

+5
source

You can use malloc() and, if necessary, extend it or use the source and see how the GNU utility works.

0
source

check the string for '\ n', if it does not exist, buffer scatter before calling the next fgets.

0
source

On POSIX getline systems that will allocate a buffer for you.

On systems other than POSIX, you can use the public broadcast feature of Chuck B. Falconer ggets , which is similar. (The Chuck Falconer site is no longer available, although archive.org has a copy , and I made my page for ggets .)

0
source

All Articles