2013-08-02 19 views
11

terminal kesiliyor hatlarından kullanıcı girişi okurken, ben yerleşik read komuta IFS=$'\n' ayarladıktan sonra kullanarak, standart girdiden satırları okumaya çalışın. Girişe okuma yapıştırırsam satırlar 4095 karakter sınırında kısaltılır. Bu sınırlama, bu mükemmel iyi çalıştı çünkü terminalden okumasını geliyormuş gibi: Linux terminali girişi: Bir bash komut dosyasında 4095 karakter sınırı

fill= 
for i in $(seq 1 94); do fill="${fill}x"; done 
for i in $(seq 1 100); do printf "%04d00$fill" $i; done | (read line; echo $line) 

Ben Python komut da aynı davranış (terminalden 4095 giriş daha uzun kabul etmedi, ancak boru kabul):

#!/usr/bin/python 

from sys import stdin 

line = stdin.readline() 
print('%s' % line) 

Hatta C programı read(2) kullanarak, aynı şekilde çalışır: her durumda

#include <stdio.h> 
#include <unistd.h> 

int main(void) 
{ 
    char buf[32768]; 
    int sz = read(0, buf, sizeof(buf) - 1); 
    buf[sz] = '\0'; 
    printf("READ LINE: [%s]\n", buf); 
    return 0; 
} 

, ben yaklaşık 4095 karakterden uzun giremez. Giriş istemi, karakterleri kabul etmeyi durdurur.

Soru-1: Linux sistemlerinde (en az Ubuntu 10.04 ve 13.04) 4095 karakterden daha uzun bir uçtan etkileşimli olarak okunmanın bir yolu var mı?

Soru-2: bu sınırlama geliyor?

Sistemleri etkilenen: Ben Ubuntu 10.04/x86 ve 13.04/x86 Bu sınırlamayı fark ettim, ama Cygwin (son versiyon en azından) 10000 üzerinde karakterden (Bunu almak gerekir çünkü daha ileri test etmedi henüz kesecek değil Ubuntu'da çalışan betik). kullanılan Terminaller: Sanal Konsol ve KDE konsole (Ubuntu 13.04) ve gnome-terminal (Ubuntu 10.04).

cevap

-1

Sana bir çözüm bulamadık ama kısaltılacak bir boruya fazla 4096 bir yazma yaparsanız ben (limits.h olarak) 4096 ayarlanır Linux IPIPE_BUF'ın olarak soruyu 2. cevap verebilir. /usr/include/linux/limits.h itibaren

:

#ifndef _LINUX_LIMITS_H 
#define _LINUX_LIMITS_H 

#define NR_OPEN   1024 

#define NGROUPS_MAX 65536 /* supplemental group IDs are available */ 
#define ARG_MAX  131072 /* # bytes of args + environ for exec() */ 
#define LINK_MAX   127 /* # links a file may have */ 
#define MAX_CANON  255 /* size of the canonical input queue */ 
#define MAX_INPUT  255 /* size of the type-ahead buffer */ 
#define NAME_MAX   255 /* # chars in a file name */ 
#define PATH_MAX  4096 /* # chars in a path name including nul */ 
#define PIPE_BUF  4096 /* # bytes in atomic write to a pipe */ 
#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ 
#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ 
#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ 

#define RTSIG_MAX  32 

#endif 
+0

Evet, boru için böyle bir sınırlama var ve aslında etkileşimli olmadığını fark etmekle alakalı. sürüm boruları kullanır ve gerekliliğe göre _several yazıyor ve reads_. Ama bence bu sınır terminal girişini etkilememelidir (terminaller boru değildir). – FooF

7

Bu kısmi cevaptır. Standart olmayan modda yılında Ayar terminali (karakter # 4096 ihtiyaçlar yeni bir satır olarak) fazla 4096 karakter okuma alanı sağlar. Bu böyle yapılabilir bir bash komut dosyasında

: Eğer 4096 karakter dizesi daha uzun yapıştırın ve edebilirsiniz stty -icanon ekleyerek bu değişiklik sonrasında

IFS=$'\n'  # Allow spaces and other white spaces. 
stty -icanon # Disable canonical mode. 
read line  # Now we can read without inhibitions set by terminal. 
stty icanon # Re-enable canonical mode (assuming it was enabled to begin with). 

I (başarıyla bash yerleşik read komutu kullanarak başarıyla okumak 10000 karakterden uzun çalıştı).

muhtemelen bir çekirdek tarafından belirlenen bir terminal hattı tampon sınırı.

YAPıLACAK:

  1. C programı Linux/x86_64 mimarisi ile
  2. Testi (tcgetattr() ve tcsetattr() kullanılarak) bunu göstermek için - Farklı sınırı olabilir.
  3. Çekirdeğin nerede bulunduğunu bulun (Bu, ${linux_source_path}/include/linux/tty.h içinde tanımlanmış olan N_TTY_BUF_SIZE).
-1

Sorun kesinlikle read(); geçerli bir tamsayı değerine kadar okuyabildiği gibi. Sorun, yığın bellek ya da boru büyüklüğünden kaynaklanır .. bunlar, boyutlar için tek olası sınırlayıcı faktörler oldukları için ..

+0

Hayır, sorun, terminal kanonik modu için arabellek boyutu. Giriş çizgisi 4096'dır (yeni satır için son bayt ayrılmıştır). Bu, orijinal sorudaki cevapta açıklanmış ve gösterilmiştir. Cevabın tamamlanmadığını söylüyor çünkü henüz bunu göstermek için bir C programı yazmak için zamana sahip değildi ve bu sınırın neresinde tanımlandığını kastedemedi. – FooF

+0

Bunu söylemek istediğim de, tampon arabelleği boyutu 4096'dır. "Ulimit -p" kullanılarak kontrol edilebilir, 8 8 512 bayt = 4096 anlamına gelir. Her karakter 1 bayt olduğu için, sadece 4095 bayt ve söylediğin gibi son satır olarak son karakteri okur. – Abhishek

+1

Farklı bir sabit olduğunu düşünüyorum. Olduğu gibi 4096 varsayılan sayfa boyutu, neden maksimum boru boyutu ve kanonik modda terminal giriş tamponu için aynı değer olduğunu açıklayan. – FooF

İlgili konular