亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tty_io.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
{	return ((current->blocked & (1<<(sig-1))) ||	        (current->sigaction[sig-1].sa_handler == SIG_IGN));}static inline int input_available_p(struct tty_struct *tty){	/* Avoid calling TTY_READ_FLUSH unnecessarily. */	if (L_ICANON(tty) ? tty->canon_data : !EMPTY(&tty->secondary))		return 1;	/* Shuffle any pending data down the queues. */	TTY_READ_FLUSH(tty);	if (tty->link)		TTY_WRITE_FLUSH(tty->link);	if (L_ICANON(tty) ? tty->canon_data : !EMPTY(&tty->secondary))		return 1;	return 0;}static int read_chan(struct tty_struct *tty, struct file *file,		     unsigned char *buf, unsigned int nr){	struct wait_queue wait = { current, NULL };	int c;	unsigned char *b = buf;	int minimum, time;	int retval = 0;	/* Job control check -- must be done at start and after	   every sleep (POSIX.1 7.1.1.4). */	/* NOTE: not yet done after every sleep pending a thorough	   check of the logic of this change. -- jlc */	/* don't stop on /dev/console */	if (file->f_inode->i_rdev != CONSOLE_DEV &&	    current->tty == tty->line) {		if (tty->pgrp <= 0)			printk("read_chan: tty->pgrp <= 0!\n");		else if (current->pgrp != tty->pgrp) {			if (is_ignored(SIGTTIN) ||			    is_orphaned_pgrp(current->pgrp))				return -EIO;			kill_pg(current->pgrp, SIGTTIN, 1);			return -ERESTARTSYS;		}	}	if (L_ICANON(tty)) {		minimum = time = 0;		current->timeout = (unsigned long) -1;	} else {		time = (HZ / 10) * TIME_CHAR(tty);		minimum = MIN_CHAR(tty);		if (minimum)		  	current->timeout = (unsigned long) -1;		else {			if (time) {				current->timeout = time + jiffies;				time = 0;			} else				current->timeout = 0;			minimum = 1;		}	}	add_wait_queue(&tty->secondary.proc_list, &wait);	while (1) {		/* First test for status change. */		if (tty->packet && tty->link->ctrl_status) {			if (b != buf)				break;			put_fs_byte(tty->link->ctrl_status, b++);			tty->link->ctrl_status = 0;			break;		}		/* This statement must be first before checking for input		   so that any interrupt will set the state back to		   TASK_RUNNING. */		current->state = TASK_INTERRUPTIBLE;		if (!input_available_p(tty)) {			if (tty->flags & (1 << TTY_SLAVE_CLOSED)) {				retval = -EIO;				break;			}			if (tty_hung_up_p(file))				break;			if (!current->timeout)				break;			if (file->f_flags & O_NONBLOCK) {				retval = -EAGAIN;				break;			}			if (current->signal & ~current->blocked) {				retval = -ERESTARTSYS;				break;			}			schedule();			continue;		}		current->state = TASK_RUNNING;		/* Deal with packet mode. */		if (tty->packet && b == buf) {			put_fs_byte(TIOCPKT_DATA, b++);			nr--;		}		while (1) {			int eol;			cli();			if (EMPTY(&tty->secondary)) {				sti();				break;			}			eol = clear_bit(tty->secondary.tail,					&tty->secondary_flags);			c = tty->secondary.buf[tty->secondary.tail];			if (!nr) {				/* Gobble up an immediately following EOF if				   there is no more room in buf (this can				   happen if the user "pushes" some characters				   using ^D).  This prevents the next read()				   from falsely returning EOF. */				if (eol) {					if (c == __DISABLED_CHAR) {						tty->canon_data--;						INC(tty->secondary.tail);					} else {						set_bit(tty->secondary.tail,							&tty->secondary_flags);					}				}				sti();				break;			}			INC(tty->secondary.tail);			sti();			if (eol) {				if (--tty->canon_data < 0) {					printk("read_chan: canon_data < 0!\n");					tty->canon_data = 0;				}				if (c == __DISABLED_CHAR)					break;				put_fs_byte(c, b++);				nr--;				break;			}			put_fs_byte(c, b++);			nr--;		}		/* If there is enough space in the secondary queue now, let the		   low-level driver know. */		if (tty->throttle && (LEFT(&tty->secondary) >= SQ_THRESHOLD_HW)		    && clear_bit(TTY_SQ_THROTTLED, &tty->flags))			tty->throttle(tty, TTY_THROTTLE_SQ_AVAIL);		if (b - buf >= minimum || !nr)			break;		if (time)			current->timeout = time + jiffies;	}	remove_wait_queue(&tty->secondary.proc_list, &wait);	current->state = TASK_RUNNING;	current->timeout = 0;	return (b - buf) ? b - buf : retval;}static int write_chan(struct tty_struct * tty, struct file * file,		      unsigned char * buf, unsigned int nr){	struct wait_queue wait = { current, NULL };	int c;	unsigned char *b = buf;	int retval = 0;	/* Job control check -- must be done at start (POSIX.1 7.1.1.4). */	if (L_TOSTOP(tty) && file->f_inode->i_rdev != CONSOLE_DEV) {		retval = check_change(tty, tty->line);		if (retval)			return retval;	}	add_wait_queue(&tty->write_q.proc_list, &wait);	while (1) {		current->state = TASK_INTERRUPTIBLE;		if (current->signal & ~current->blocked) {			retval = -ERESTARTSYS;			break;		}		if (tty_hung_up_p(file) || (tty->link && !tty->link->count)) {			retval = -EIO;			break;		}		while (nr > 0) {			c = get_fs_byte(b);			/* Care is needed here: opost() can abort even			   if the write_q is not full. */			if (opost(c, tty) < 0)				break;			b++; nr--;		}		TTY_WRITE_FLUSH(tty);		if (!nr)			break;		if (EMPTY(&tty->write_q) && !need_resched)			continue;		if (file->f_flags & O_NONBLOCK) {			retval = -EAGAIN;			break;		}		schedule();	}	current->state = TASK_RUNNING;	remove_wait_queue(&tty->write_q.proc_list, &wait);	return (b - buf) ? b - buf : retval;}static int tty_read(struct inode * inode, struct file * file, char * buf, int count){	int i, dev;	struct tty_struct * tty;	dev = file->f_rdev;	if (MAJOR(dev) != TTY_MAJOR) {		printk("tty_read: bad pseudo-major nr #%d\n", MAJOR(dev));		return -EINVAL;	}	dev = MINOR(dev);	tty = TTY_TABLE(dev);	if (!tty || (tty->flags & (1 << TTY_IO_ERROR)))		return -EIO;	/* This check not only needs to be done before reading, but also	   whenever read_chan() gets woken up after sleeping, so I've	   moved it to there.  This should only be done for the N_TTY	   line discipline, anyway.  Same goes for write_chan(). -- jlc. */#if 0	if ((inode->i_rdev != CONSOLE_DEV) && /* don't stop on /dev/console */	    (tty->pgrp > 0) &&	    (current->tty == dev) &&	    (tty->pgrp != current->pgrp))		if (is_ignored(SIGTTIN) || is_orphaned_pgrp(current->pgrp))			return -EIO;		else {			(void) kill_pg(current->pgrp, SIGTTIN, 1);			return -ERESTARTSYS;		}#endif	if (ldiscs[tty->disc].read)		/* XXX casts are for what kernel-wide prototypes should be. */		i = (ldiscs[tty->disc].read)(tty,file,(unsigned char *)buf,(unsigned int)count);	else		i = -EIO;	if (i > 0)		inode->i_atime = CURRENT_TIME;	return i;}static int tty_write(struct inode * inode, struct file * file, char * buf, int count){	int dev, i, is_console;	struct tty_struct * tty;	dev = file->f_rdev;	is_console = (inode->i_rdev == CONSOLE_DEV);	if (MAJOR(dev) != TTY_MAJOR) {		printk("tty_write: pseudo-major != TTY_MAJOR\n");		return -EINVAL;	}	dev = MINOR(dev);	if (is_console && redirect)		tty = redirect;	else		tty = TTY_TABLE(dev);	if (!tty || !tty->write || (tty->flags & (1 << TTY_IO_ERROR)))		return -EIO;#if 0	if (!is_console && L_TOSTOP(tty) && (tty->pgrp > 0) &&	    (current->tty == dev) && (tty->pgrp != current->pgrp)) {		if (is_orphaned_pgrp(current->pgrp))			return -EIO;		if (!is_ignored(SIGTTOU)) {			(void) kill_pg(current->pgrp, SIGTTOU, 1);			return -ERESTARTSYS;		}	}#endif	if (ldiscs[tty->disc].write)		/* XXX casts are for what kernel-wide prototypes should be. */		i = (ldiscs[tty->disc].write)(tty,file,(unsigned char *)buf,(unsigned int)count);	else		i = -EIO;	if (i > 0)		inode->i_mtime = CURRENT_TIME;	return i;}/* * This is so ripe with races that you should *really* not touch this * unless you know exactly what you are doing. All the changes have to be * made atomically, or there may be incorrect pointers all over the place. */static int init_dev(int dev){	struct tty_struct *tty, *o_tty;	struct termios *tp, *o_tp, *ltp, *o_ltp;	int retval;	int o_dev;	o_dev = PTY_OTHER(dev);	tty = o_tty = NULL;	tp = o_tp = NULL;	ltp = o_ltp = NULL;repeat:	retval = -EAGAIN;	if (IS_A_PTY_MASTER(dev) && tty_table[dev] && tty_table[dev]->count)		goto end_init;	retval = -ENOMEM;	if (!tty_table[dev] && !tty) {		if (!(tty = (struct tty_struct*) get_free_page(GFP_KERNEL)))			goto end_init;		initialize_tty_struct(dev, tty);		goto repeat;	}	if (!tty_termios[dev] && !tp) {		tp = (struct termios *) kmalloc(sizeof(struct termios),						GFP_KERNEL);		if (!tp)			goto end_init;		initialize_termios(dev, tp);		goto repeat;	}	if (!termios_locked[dev] && !ltp) {		ltp = (struct termios *) kmalloc(sizeof(struct termios),						 GFP_KERNEL);		if (!ltp)			goto end_init;		memset(ltp, 0, sizeof(struct termios));		goto repeat;	}	if (IS_A_PTY(dev)) {		if (!tty_table[o_dev] && !o_tty) {			o_tty = (struct tty_struct *)				get_free_page(GFP_KERNEL);			if (!o_tty)				goto end_init;			initialize_tty_struct(o_dev, o_tty);			goto repeat;		}		if (!tty_termios[o_dev] && !o_tp) {			o_tp = (struct termios *)				kmalloc(sizeof(struct termios), GFP_KERNEL);			if (!o_tp)				goto end_init;			initialize_termios(o_dev, o_tp);			goto repeat;		}		if (!termios_locked[o_dev] && !o_ltp) {			o_ltp = (struct termios *)				kmalloc(sizeof(struct termios), GFP_KERNEL);			if (!o_ltp)				goto end_init;			memset(o_ltp, 0, sizeof(struct termios));			goto repeat;		}			}	/* Now we have allocated all the structures: update all the pointers.. */	if (!tty_termios[dev]) {		tty_termios[dev] = tp;		tp = NULL;	}	if (!tty_table[dev]) {		tty->termios = tty_termios[dev];		tty_table[dev] = tty;		tty = NULL;	}	if (!termios_locked[dev]) {		termios_locked[dev] = ltp;		ltp = NULL;	}	if (IS_A_PTY(dev)) {		if (!tty_termios[o_dev]) {			tty_termios[o_dev] = o_tp;			o_tp = NULL;		}		if (!termios_locked[o_dev]) {			termios_locked[o_dev] = o_ltp;			o_ltp = NULL;		}		if (!tty_table[o_dev]) {			o_tty->termios = tty_termios[o_dev];			tty_table[o_dev] = o_tty;			o_tty = NULL;		}		tty_table[dev]->link = tty_table[o_dev];		tty_table[o_dev]->link = tty_table[dev];	}	tty_table[dev]->count++;	if (IS_A_PTY_MASTER(dev))		tty_table[o_dev]->count++;	retval = 0;end_init:	if (tty)		free_page((unsigned long) tty);	if (o_tty)		free_page((unsigned long) o_tty);	if (tp)		kfree_s(tp, sizeof(struct termios));	if (o_tp)		kfree_s(o_tp, sizeof(struct termios));	if (ltp)		kfree_s(ltp, sizeof(struct termios));	if (o_ltp)		kfree_s(o_ltp, sizeof(struct termios));	return retval;}/* * Even releasing the tty structures is a tricky business.. We have * to be very careful that the structures are all released at the * same time, as interrupts might otherwise get the wrong pointers. */static void release_dev(int dev, struct file * filp){	struct tty_struct *tty, *o_tty;	struct termios *tp, *o_tp;	struct task_struct **p;	tty = tty_table[dev];	tp = tty_termios[dev];	o_tty = NULL;	o_tp = NULL;	if (!tty) {		printk("release_dev: tty_table[%d] was NULL\n", dev);		return;	}	if (!tp) {		printk("release_dev: tty_termios[%d] was NULL\n", dev);		return;	}#ifdef TTY_DEBUG_HANGUP	printk("release_dev of tty%d (tty count=%d)...", dev, tty->count);#endif	if (IS_A_PTY(dev)) {		o_tty = tty_table[PTY_OTHER(dev)];		o_tp = tty_termios[PTY_OTHER(dev)];		if (!o_tty) {			printk("release_dev: pty pair(%d) was NULL\n", dev);			return;		}		if (!o_tp) {			printk("release_dev: pty pair(%d) termios was NULL\n", dev);			return;		}		if (tty->link != o_tty || o_tty->link != tty) {			printk("release_dev: bad pty pointers\n");			return;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女视频黄久久| 国产香蕉久久精品综合网| 337p亚洲精品色噜噜噜| 日韩欧美精品在线视频| 中文在线资源观看网站视频免费不卡| 综合在线观看色| 日本午夜精品视频在线观看| 国产真实乱偷精品视频免| 北条麻妃国产九九精品视频| 欧美人与性动xxxx| 久久久国产一区二区三区四区小说 | 日韩一区二区免费高清| 久久夜色精品国产噜噜av| 亚洲视频一区在线观看| 免费人成在线不卡| 99久久精品国产麻豆演员表| 91精品在线观看入口| 中文字幕一区二区三区色视频| 日本午夜一区二区| 91麻豆精东视频| 精品久久久久久无| 亚洲国产一二三| 国产成人一级电影| 日韩午夜在线观看| 一区二区在线免费观看| 国产精品一区2区| 欧美日韩一区成人| 亚洲欧洲日产国码二区| 麻豆国产精品777777在线| 色欧美片视频在线观看在线视频| 精品国产sm最大网站| 亚洲综合久久久久| 风流少妇一区二区| 日韩一级片网站| 亚洲第一电影网| 99国产精品久久久久久久久久| 日韩精品一区二区在线观看| 一区二区三区国产豹纹内裤在线| 国产精品一二三区| 91精品国产色综合久久| 亚洲免费视频成人| 成人免费三级在线| 久久久国产综合精品女国产盗摄| 日本三级亚洲精品| 欧美日韩久久不卡| 亚洲一区av在线| 91亚洲国产成人精品一区二三| 久久香蕉国产线看观看99| 男女性色大片免费观看一区二区 | 视频一区在线播放| 在线影视一区二区三区| 一色屋精品亚洲香蕉网站| 国产福利91精品一区二区三区| 日韩视频在线永久播放| 视频在线观看国产精品| 欧美色视频一区| 亚洲免费观看高清完整版在线观看 | 欧美电影影音先锋| 亚洲一区二区三区视频在线 | 亚洲免费在线看| 成人av在线一区二区三区| 26uuu国产在线精品一区二区| 日本不卡一二三区黄网| 4438亚洲最大| 琪琪一区二区三区| 日韩午夜av一区| 美女一区二区久久| 日韩丝袜情趣美女图片| 美女任你摸久久| 日韩精品一区国产麻豆| 蜜桃av一区二区| 日韩你懂的在线播放| 蜜臀av性久久久久蜜臀av麻豆| 51精品国自产在线| 三级久久三级久久| 日韩视频123| 久久国产精品无码网站| 精品国精品国产| 国产精品一级黄| 久久精品欧美日韩| 成人污视频在线观看| 中文字幕五月欧美| 91蜜桃婷婷狠狠久久综合9色| 亚洲视频每日更新| 欧美亚洲一区二区在线| 爽好多水快深点欧美视频| 日韩三区在线观看| 韩国av一区二区三区| 亚洲国产精品二十页| 99久久婷婷国产综合精品| 一区二区三区四区av| 色呦呦国产精品| 日日夜夜免费精品| 精品国产91亚洲一区二区三区婷婷| 久久精品国产精品亚洲综合| 国产亚洲综合在线| 北岛玲一区二区三区四区| 亚洲一区二区三区不卡国产欧美| 欧美日韩精品欧美日韩精品一| 亚洲国产精品嫩草影院| 欧美大片一区二区三区| 国产精品一级黄| 1区2区3区精品视频| 欧美精品精品一区| 韩国理伦片一区二区三区在线播放| 国产欧美日本一区视频| 91在线免费看| 午夜影院在线观看欧美| 欧美精品一区二| 99精品视频一区| 日韩 欧美一区二区三区| 久久综合狠狠综合久久综合88| 色综合久久综合网| 日韩不卡一区二区三区| 国产精品午夜在线观看| 欧美亚洲日本国产| 国产一区亚洲一区| 亚洲人亚洲人成电影网站色| 欧美一区二区视频观看视频| 成人免费电影视频| 奇米影视7777精品一区二区| 久久亚洲欧美国产精品乐播| 在线观看亚洲专区| 狠狠色狠狠色综合系列| 亚洲精品免费在线| 精品久久久久久久久久久院品网| 不卡的av在线| 久久国内精品视频| 一区二区三区四区在线免费观看 | 国产精品夜夜嗨| 亚洲mv大片欧洲mv大片精品| 久久久久久久综合色一本| 欧美三级韩国三级日本三斤 | 亚洲欧美一区二区三区国产精品| 日韩视频一区二区在线观看| 91免费看片在线观看| 免费在线看一区| 亚洲天堂av老司机| 精品免费视频一区二区| 日本高清不卡aⅴ免费网站| 国产精品一区二区久久精品爱涩| 亚洲综合激情另类小说区| 国产欧美一区二区精品性色| 欧美久久一区二区| av成人老司机| 国产剧情一区在线| 奇米影视一区二区三区| 一区二区三区精品视频| 中文字幕二三区不卡| 日韩久久精品一区| 欧美伊人久久大香线蕉综合69| 国产99久久久精品| 国内精品国产成人国产三级粉色 | 欧美日韩一区二区在线视频| 成人美女在线观看| 裸体一区二区三区| 亚洲电影在线播放| 亚洲色图欧美在线| 国产精品美女久久久久aⅴ| 精品国产一区二区三区四区四| 欧美日韩黄视频| 91色在线porny| www.日韩av| 丁香婷婷综合网| 国产自产视频一区二区三区| 日韩综合小视频| 午夜精品久久久久久久99樱桃| 亚洲精品亚洲人成人网在线播放| 欧美高清在线精品一区| 国产视频一区二区三区在线观看| 日韩精品专区在线| 91精品国产综合久久香蕉麻豆| 欧美日韩一区三区四区| 欧美日韩一区国产| 欧美日韩一本到| 欧美日韩中文字幕一区二区| 欧美性色欧美a在线播放| 99r国产精品| 91在线观看高清| av欧美精品.com| 91亚洲男人天堂| 日本高清不卡aⅴ免费网站| 色婷婷亚洲精品| 欧美三级电影精品| 欧美亚男人的天堂| 欧美日韩一区三区| 5566中文字幕一区二区电影| 欧美一区二区视频在线观看| 91精品福利在线一区二区三区| 91精品国产综合久久香蕉的特点 | 国产一区二区三区综合| 国产在线精品一区二区三区不卡 | 国产成人在线电影| 国产欧美一区二区在线观看| 国产欧美日韩精品在线| 国产蜜臀av在线一区二区三区| 中文文精品字幕一区二区| 国产精品久久久久影院亚瑟| 亚洲女人小视频在线观看| 亚洲一线二线三线视频|