2013-08-02 8 views
11

पर टर्मिनल ट्रंकिंग लाइनों से उपयोगकर्ता इनपुट पढ़ना एक बैश स्क्रिप्ट में, IFS=$'\n' सेट करने के बाद अंतर्निहित read कमांड का उपयोग करके, मैं मानक इनपुट से लाइनों को पढ़ने का प्रयास करता हूं। अगर मैं पढ़ने के लिए इनपुट पेस्ट करता हूं तो लाइनों को 40 9 5 वर्ण सीमा पर छोटा कर दिया जाता है। क्योंकि इस बिल्कुल ठीक काम किया यह सीमा, टर्मिनल से पढ़ने से आने के लिए लगता है:लिनक्स टर्मिनल इनपुट: 4095 वर्ण सीमा

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) 

मैं अजगर स्क्रिप्ट के साथ एक ही व्यवहार का अनुभव (टर्मिनल से 4095 इनपुट से अधिक समय को स्वीकार नहीं किया है, लेकिन पाइप से स्वीकार किए जाते हैं):

#!/usr/bin/python 

from sys import stdin 

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

यहां तक ​​कि सी कार्यक्रम में एक ही काम करता है, read(2) का उपयोग कर:

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

सभी मामलों में, मैं 4095 के बारे में वर्णों से अधिक प्रवेश नहीं कर सकते। इनपुट प्रॉम्प्ट पात्रों को स्वीकार करना बंद कर देता है।

प्रश्न -1: क्या लिनक्स सिस्टम (कम से कम उबंटू 10.04 और 13.04) में 4095 वर्णों से अधिक टर्मिनल से इंटरैक्टिव रूप से पढ़ने का कोई तरीका है?

प्रश्न -2: यह सीमा कहां से आती है?

सिस्टम प्रभावित: मैं Ubuntu में 10.04/86 और 13.04/86 इस सीमा देखा है, लेकिन Cygwin (हाल के संस्करण कम से कम) 10000 से अधिक अक्षर (के बाद से मैं इस प्राप्त करने की आवश्यकता आगे का परीक्षण नहीं किया था पर अभी तक काट-छांट नहीं करता उबंटू में काम कर रहे स्क्रिप्ट)। टर्मिनल का इस्तेमाल किया गया: वर्चुअल कंसोल और केडीई konsole (उबंटू 13.04) और gnome-terminal (उबंटू 10.04)।

उत्तर

-1

मैं तुम्हारे लिए एक समाधान नहीं है, लेकिन मैं सवाल 2. linux PIPE_BUF में जवाब कर सकते हैं 4096 के लिए निर्धारित है (limits.h में) यदि आप एक पाइप इसे काट दिया जाएगा करने के लिए एक से अधिक 4096 के एक लिखने करते हैं।

/usr/include/linux/limits.h से:

#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

हां पाइप के लिए ऐसी सीमा है, और वास्तव में यह ध्यान देने योग्य है कि गैर-इंटरैक्टिव संस्करण पाइप का उपयोग करता है और आवश्यकता से _several लिखता है और reads_ होगा। लेकिन मुझे लगता है कि इस सीमा को टर्मिनल इनपुट को प्रभावित नहीं करना चाहिए (टर्मिनल पाइप नहीं हैं)। – FooF

7

यह आंशिक जवाब है। गैर-कैननिकल मोड में टर्मिनल सेट करना 4096 से अधिक वर्ण पढ़ने की अनुमति देता है (जहां चरित्र # 4096 को एक नई पंक्ति होने की आवश्यकता है)।

एक bash स्क्रिप्ट इस इस तरह से किया जा सकता है:

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). 

stty -icanon जोड़ने आप 4096 से चरित्र स्ट्रिंग अब पेस्ट और कर सकते हैं के इस संशोधन के बाद इसे सफलतापूर्वक का उपयोग कर bash निर्मित read आदेश को पढ़ने के (मैं सफलतापूर्वक 10000 से अधिक वर्णों की कोशिश की)।

टर्मिनल लाइन बफर की सीमा शायद कहीं कर्नेल द्वारा सेट की गई है।

कार्यसूची:

  1. सी कार्यक्रम इस
  2. लिनक्स/x86_64 आर्किटेक्चर के साथ टेस्ट (tcgetattr() और tcsetattr() का प्रयोग करके) प्रदर्शित करने के लिए - अलग सीमा हो सकता था।
  3. यह पता लगाएं कि कर्नेल में यह कहां परिभाषित किया गया है (शायद N_TTY_BUF_SIZE${linux_source_path}/include/linux/tty.h में परिभाषित)।
-1

समस्या निश्चित रूप से पढ़ी नहीं है(); क्योंकि यह किसी वैध पूर्णांक मान तक पढ़ सकता है। समस्या ढेर मेमोरी या पाइप आकार से आती है .. क्योंकि वे आकार के लिए केवल संभावित सीमित कारक हैं ..

+0

नहीं, समस्या टर्मिनल कैननिकल मोड के लिए बफर आकार है। इनपुट लाइन 4096 है (अंतिम बाइट नई लाइन के लिए आरक्षित)। यह मूल प्रश्नकर्ता द्वारा उत्तर में समझाया और प्रदर्शित किया गया है। वह कह रहा है कि जवाब पूरा नहीं हुआ है क्योंकि उसके पास इसका प्रदर्शन करने के लिए सी प्रोग्राम लिखने का समय नहीं था, और वह यह इंगित नहीं कर सका कि कर्नेल में यह सीमा परिभाषित की गई है। – FooF

+0

यही वह है जो मैं कहने की कोशिश कर रहा हूं, पाइप बफर आकार 4096 है। इसे "ulimit -p" का उपयोग करके चेक किया जा सकता है, यह उत्तर के रूप में 8 लौटाएगा, जिसका अर्थ है 8 * 512 बाइट = 4096। चूंकि प्रत्येक वर्ण 1 बाइट है, इसलिए यह केवल 40 9 5 बाइट्स और आखिरी चरित्र को न्यूलाइन के रूप में पढ़ता है जैसा आपने कहा था। – Abhishek

+1

मुझे लगता है कि यह एक अलग स्थिर है। जैसा कि होता है 4096 डिफ़ॉल्ट पृष्ठ आकार होता है, यह बताता है कि अधिकतम पाइप आकार और कैननिकल मोड में टर्मिनल इनपुट बफर के लिए मान समान क्यों होता है। – FooF

संबंधित मुद्दे