• cat功能

    2007-12-05

    选项描述
      -b不对空白行编号。
      -e使用 $ 字符显示行尾。
      -n从 1 开始对所有输出行编号。
      -q使用静默操作(禁止错误消息)。
      -r将所有多个空行替换为单行(“压缩”空白)。
      -S将多个空白行压缩到单行中(与 -r 相同)。
      -s禁止错误消息(静默操作)。
      -t将制表符显示为 ^I
      -u不对输出进行缓冲。
      -v可视地显示非打印控制字符。

    例:

    1。在文件末位追加:cat >> file , 输入文字,以ctrol-D结束

    2。在文件前追加:cat -file >> newfile,输入文字,以ctrol-D结束

  • 1. sigaction结构体 

    struct sigaction {
                      union{
                            __sighandler_t _sa_handler;
                                   void (*_sa_sigaction)(int,struct siginfo_t *, void *);
                      }_u
                      sigset_t sa_mask;
                      unsigned long sa_flags;
                      void (*sa_restorer)(void);

    }

    union中的第一个__sighandler_t代表单参数信号处理函数,参数为信号值,还可以为系统提供的值如:

    #define SIG_ERR ((__sighandler_t) -1)           /* Error return.  */
    #define SIG_DFL ((__sighandler_t) 0)            /* Default action.  */
    #define SIG_IGN ((__sighandler_t) 1)            /* Ignore signal.  */
    union中的第二个函数指针,使用户可以自己定义三参数信号处理函数,其中第二个参数类型siginfo_t,定义如下:

    2. 对于real-time signal,结构定义如下:
    
    typedef struct {	int si_signo;  /* 信号值,对所有信号有意义*/	
    
    int si_errno;  /* errno值,对所有信号有意义*/	
    
    int si_code;   /* 信号产生的原因,对所有信号有意义*/	
    
    union sigval si_value; /*对real-time signal 有意义 */	
    
    } siginfo_t;第四个union定义如下:
    
    3.union sigval {int sival_int;void *sival_ptr;}
    
    该结构指明value要么是一个整形的值,或者是一个指针,这就使得编程者可以通过传递指针来传递一个
    
    复杂的对象或结构。
    
    * 信号函数之间的参数传递情况如下:
    
    sigqueue 函数的第三参数,参数sigval将传递(拷贝)到sigaction函数的第二参数
    
    sigaction结构体中的_sa_sigaction
    
    指向函数的siginfo_t中的si_value值。(拗口!)
    
  • Real-time signal 是linux 2.3内核后引入的新的feature。类似于win32的Completion Port, Realtime signal 机制可用于反应器,适用于server的高速IO模型。

    Real-time signal 的原理是,将文件描述符通过fnctl 设置为nonblock,类似这样:

     nflags |= O_RDWR | O_NONBLOCK | O_ASYNC;
     nFcntl = ::fcntl(aFd, F_SETFL, nflags);

     再将该句柄与具体的real-time signal 绑定,

    nFcntl = ::fcntl(aFd, F_SETSIG, RTSIG_X)

    最后设置这个描述符将该信号报往的进程Pid

    nFcntl = ::fcntl(aFd, F_SETOWN, Pid);

    这些工作做完之后,当该文件描述符发生io操作时将上报给进程real-time signal RTSIG-X

    而reactor可以run一个工作线程,并设置感兴趣的信号集sigset为阻塞状态

    nRet = ::sigprocmask(SIG_BLOCK, &sigset, NULL);

    linux proc/ 文件系统中的设置rt signal 最大值的文件是/proc/sys/kernel/rtsig-max,可以通

    _sysctl命令进行调解。节点名为{ CTL_KERN, KERN_RTSIGMAX }

    OK, 一切做完之后,我们只要将工作线程run起来后,做等待信号操作

    sigRet = ::sigwaitinfo(&sigset, &siginfo);

    返回后并检查siginfo.si_band的值,如果是POLLERR|POLLHUP|POLLNVAL 为error值,

    否则处理该句柄,进行相应的读写操作。

    while(!shutDown())
    {
        int sigret = sigwaitinfo(&sigset, &siginfo);
        ...
        handleEvent(sigret,...)
    }

  •      有需求要检查应用程序当磁盘满时的内存激增现象,写满物理硬盘不仅困难且自身的额外操作也将受到限制,采用linux下自带命令可创建一个ext2的Image,将此Image mount进系统,就可完成一个新分区的创建。过程如下

    1. dd if=/dev/hda1 of=image.iso bs=2048 count=1024 // 创建一个block size为2048bytes,1024个block的空文件image.iso

    2. losetup /dev/loop0 image.iso // 因image.iso不是块设备,不能进行文件系统创建,需要将其和一个块设备联系起来

    3. mkfs -t ext2 /dev/loop0 // 创建ext2文件系统

    4. mount -t ext2 /dev/loop0 /mnt //将设备mount到/mnt目录中

    ...............................// 进行对mnt的操作,拷贝文件等

    5. umount /mnt

    6. losetup -d /dev/loop0 // 解除联系

    此后就可以用mount -t ext2 -o loop image.iso /mnt/ 来直接mount该分区了

     

  •  Oracle 10g rac 始支持两个instance的failover和loadbalance。示例如下:

    VMRACTEST.HF.COM=
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.209.47) (PORT = 1521))
          (ADDRESS = (PROTOCOL = TCP) (HOST = 172.16.209.49) (PORT = 1521))
            (LOAD_BALANCE = yes)
            (CONNECT_DATA =
                (SERVER = DEDICATED)
                (SERVICE_NAME = vmractest.hf.com)
            (FAILOVER_MODE =
                (TYPE = SELECT)
                (METHOD = BASIC)
                (RETRIES = 180)
                (DELAY = 5))
            )
        )

     如上配置,若使用oci client连接RAC则client将连接到172.16.209.47 或 172.16.209.49的任意一台实例上,假设我们连到了49上。TCP Connection状态为ESTABLISHED。当49的instance发生故障,该client端TCP连接状态变为Close_WAIT,不要以为连接已断。当我们执行数据库操作时,oci将重连到47的TCP Connection