Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
UNIX қате коды
Unix қате коды
the UNIX error code
Unix error code
Компьютерде "Not a typewriter" немесе ENOTTY – көптеген Unix жүйелеріндегі errno.h файлында анықталған қате коды. Бұл код қазір ioctl жүйелік шақыруында жарамсыз ioctl (кіріс/шығыс басқару) нөмірі берілгенін көрсету үшін қолданылады.
In computing, "Not a typewriter" or ENOTTY is an error code defined in the errno. h found on many Unix systems. This code is now used to indicate that an invalid ioctl (input/output control) number was specified in an ioctl system call.
Егжей-тегжейлер
Бұл қате алғашқы UNIX жүйелерінде пайда болды. UNIX-тің 6-шы нұсқасында және одан бұрынғы нұсқаларында кіріс-шығыс (I/O) басқаруы көбінесе gtty және stty жүйелік шақырулары арқылы сериялық байланыспен қосылған терминал құрылғыларымен, әдетте телетиппен (қысқаша TTY) шектелген. Егер осы шақыруларды терминал емес құрылғыда қолдануға тырысқанда, ENOTTY қатесі туындады. stty/gtty жүйелік шақырулары ioctl (кіріс-шығыс басқаруы) шақыруымен ауыстырылғанда, ENOTTY қате коды сақталды. Алғашқы компьютерлер мен Unix жүйелері терминал ретінде электромеханикалық жазу машиналарын пайдаланды. Қазіргі UNIX жүйелерінде кеңінен қолданылатын TTY аббревиатурасы "Teletypewriter" (телетайп машинасы) дегенді білдіреді. Мысалы, SIGHUP сигналының бастапқы мағынасы – телетайп машинасына қосылған телефон желісін ажырату. "Тайптайп" термині "Teletype" AT&T еншілес компаниясы Teletype Corporation-ның тіркелген тауарлық белгісі болғандықтан және тым арнайы болғандықтан қолданылған болуы мүмкін. "Teletype" атауы "телетайп" деген жалпы терминнен туындаған, ал "тайп" сөзін қолдану – сол бастапқы терминнің басқаша қысқартылған түрі. POSIX бұл мәселені ENOTTY қатесін "терминал емес" деп сипаттап шешіп алды. Ioctl енді терминалдардан басқа құрылғыларда да қолдау көрсетілгендіктен, кейбір жүйелер "Құрылғы үшін тиіссіз ioctl" сияқты басқа хабарламаны көрсетуі мүмкін.
This error originated in early UNIX. In Version 6 UNIX and earlier, I/O control was limited to serial connected terminal devices, typically a teletype (abbreviated TTY), through the gtty and stty system calls. If an attempt was made to use these calls on a non terminal device, the error generated was ENOTTY. When the stty/gtty system calls were replaced with the more general ioctl (I/O control) call, the ENOTTY error code was retained. Early computers and Unix systems used electromechanical typewriters as terminals. The abbreviation TTY, which occurs widely in modern UNIX systems, stands for "Teletypewriter." For example, the original meaning of the SIGHUP signal is that it Hangs UP the phone line on the teletypewriter which uses it. The generic term "typewriter" was probably used because "Teletype" was a registered trademark of AT&T subsidiary Teletype Corporation and was too specific. The name "Teletype" was derived from the more general term, "teletypewriter"; using "typewriter" was a different contraction of the same original term. POSIX sidesteps this issue by describing ENOTTY as meaning "not a terminal". Because ioctl is now supported on other devices than terminals, some systems display a different message such as "Inappropriate ioctl for device" instead.
Пайда болуы
Кейбір жағдайларда, бұл хабарлама бағдарламадан ioctl сұранысы жасалмаған кезде де пайда болуы мүмкін. Бұл isatty кітапханасының жұмыс істеу принципіне байланысты. Errno қате коды тек жүйелік шақыру сәтсіз аяқталғанда ғана орнатылады. C стандартты кіріс-шығыс кітапханасы жасаған алғашқы жүйелік шақырулардың бірі – бағдарламаның адаммен интерактивті түрде жұмыс істейтінін анықтау үшін қолданылатын isatty шақыруы (мұндай жағдайда isatty сәтті орындалады және кітапхана шығысын жол-жолмен жазады, нәтижесінде пайдаланушы мәтіннің үздіріліссіз ағынын көреді) немесе құбырдың бір бөлігі ретінде (мұндай жағдайда тиімділік үшін бірден бір блок жазады). Егер кітапхананың әрекеті жүйелік шақырумен байланысты емес себептерге байланысты сәтсіз болса (мысалы, пароль файлында пайдаланушы аты табылмайтын болса) және тәжірибесіз бағдарламашы әр сәтсіздікке қарамастан, қате туралы хабар беру функциясын (perror) салғысыз түрде шақырып жатса, қалған ENOTTY коды пайдаланушыға мүлдем орынсыз "Жазу машинасы емес" (немесе "Телетайп емес" немесе "Құрылғы үшін қолайсыз ioctl") деген хабарламаны жеткізеді. UNIX пошта бағдарламасы sendmail көп жылдар бойы осындай қатеге тап болды: басқа жүйеден пошта келген кезде, пошта бағдарламасы интерактивті емес режимде жұмыс істеді. Егер мақсатты мекенжай жергілікті болса, бірақ жергілікті пароль файлында табылмайтын пайдаланушы атына сілтеме жасалса, электрондық хаттың авторына жіберілген хабарлама, олармен байланысуға тырысқан адамның жазу машинасы емес екендігі туралы хабарлама болды.
In some cases, this message will occur even when no ioctl has been issued by the program. This is due to the way the isatty library routine works. The error code errno is only set when a system call fails. One of the first system calls made by the C standard I/O library is in an isatty call used to determine if the program is being run interactively by a human (in which case isatty will succeed and the library will write its output a line at a time so the user sees a regular flow of text) or as part of a pipeline (in which case it writes a block at a time for efficiency). If a library routine fails for some reason unrelated to a system call (for example, because a user name wasn't found in the password file) and a naïve programmer blindly calls the normal error reporting routine perror on every failure, the leftover ENOTTY will result in an utterly inappropriate "Not a typewriter" (or "Not a teletype", or "Inappropriate ioctl for device") being delivered to the user. For many years the UNIX mail program sendmail contained this bug: when mail was delivered from another system, the mail program was being run non interactively. If the destination address was local, but referred to a user name not found in the local password file, the message sent back to the originator of the email was the announcement that the person they were attempting to communicate with was not a typewriter.