注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

后台进程read和write时发生的问题  

2011-04-15 21:48:18|  分类: Linux内核 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、tty写入时操作

linux-2.6.37.1\drivers\tty\n_tty.c

static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,
      const unsigned char *buf, size_t nr)
{
 const unsigned char *b = buf;
 DECLARE_WAITQUEUE(wait, current);
 int c;
 ssize_t retval = 0;

 /* Job control check -- must be done at start (POSIX.1 7.1.1.4). */
 if (L_TOSTOP(tty) && file->f_op->write != redirected_tty_write) {
  retval = tty_check_change(tty);
  if (retval)
   return retval;
 }


/**
 * tty_check_change - check for POSIX terminal changes
 * @tty: tty to check
 *
 * If we try to write to, or set the state of, a terminal and we're
 * not in the foreground, send a SIGTTOU.  If the signal is blocked or
 * ignored, go ahead and perform the operation.  (POSIX 7.2)
 *
 * Locking: ctrl_lock
 */

int tty_check_change(struct tty_struct *tty)
{
 unsigned long flags;
 int ret = 0;

 if (current->signal->tty != tty)
  return 0;

 spin_lock_irqsave(&tty->ctrl_lock, flags);

 if (!tty->pgrp) {
  printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n");
  goto out_unlock;
 }
 if (task_pgrp(current) == tty->pgrp)
  goto out_unlock;
 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 if (is_ignored(SIGTTOU))
  goto out;
 if (is_current_pgrp_orphaned()) {
  ret = -EIO;
  goto out;
 }
 kill_pgrp(task_pgrp(current), SIGTTOU, 1);
 set_thread_flag(TIF_SIGPENDING);
 ret = -ERESTARTSYS;
out:
 return ret;
out_unlock:
 spin_unlock_irqrestore(&tty->ctrl_lock, flags);
 return ret;
}
这里如果当前写tty的任务不是当前tty设备的前端进程组,那么就会触发SIGTTOU信号。但是我们一般通过stty -a 可以看到,前面n_tty_write函数中判断的L_TOSTOP(tty)是不满足的,所以一般后台任务向tty执行写操作时不会有问题的

二、后台任务的读入操作


static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
    unsigned char __user *buf, size_t nr)
 c = job_control(tty, file);
 if (c < 0)
  return c;

 


/**
 * job_control  - check job control
 * @tty: tty
 * @file: file handle
 *
 * Perform job control management checks on this file/tty descriptor
 * and if appropriate send any needed signals and return a negative
 * error code if action should be taken.
 *
 * FIXME:
 * Locking: None - redirected write test is safe, testing
 * current->signal should possibly lock current->sighand
 * pgrp locking ?
 */

static int job_control(struct tty_struct *tty, struct file *file)
{
 /* 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_op->write != redirected_tty_write &&
     current->signal->tty == tty) {
  if (!tty->pgrp)
   printk(KERN_ERR "n_tty_read: no tty->pgrp!\n");
  else if (task_pgrp(current) != tty->pgrp) {
   if (is_ignored(SIGTTIN) ||
       is_current_pgrp_orphaned())
    return -EIO;
   kill_pgrp(task_pgrp(current), SIGTTIN, 1);
   set_thread_flag(TIF_SIGPENDING);
   return -ERESTARTSYS;
  }
 }
 return 0;
}

这里的判断还是比较简单的,如果当前任务不是前台任务,那么就会收到SIGTTIN信号,这些信号的默认操作都是杀死任务
三、console设备

console是内核可以感受到的一个设备,最为直接的应用就是在printk函数中,当内核printk的时候,内核会调用所有的注册的console的write接口。但是,即使是一个tty,如果没有通过console注册给内核,那么内核printk的时候同样不会向这里打印内核信息。

四。ttyS

这是一个物理的ttyS也即是我们常说的主板上集成的串口1和串口2,其中的S是serial的缩写。然后ptmx是一个特殊设备,每打开一次,就会生成一个伪终端对。为对于伪终端,则分别为pts,其中的s为slave的缩写,其中的p为pseudo的缩写

  评论这张
 
阅读(780)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017