Linux中alarm函数和信号处理

alarm函数作用是设定一个计时器,到时间后会向进程发送信号。
它向进程发送SIGALRM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。
我们还可以调用alarm(0)来取消此闹钟,并返回剩余时间。

函数原型:
unsigned int alarm(unsigned int seconds);
函数参数:
seconds:指定的秒数
继续阅读Linux中alarm函数和信号处理

oracle中update和for update

update
对表中一行记录的修改,修改时会加锁。

select … for update
对满足条件的select结果集加锁。
如果结果集只要有一行记录被另一个session加锁,那么就会阻塞,直到那个session最后commit或者rollback之后执行。

select … for update nowait
如果满足条件的结果集只要有一行已经加锁了,不等待立即返回错误:
ORA-00054: resource busy and acquire with NOWAIT specified

for update和for update nowait加上的是一个行级排它锁。update加上的是一个共享锁,也就是说在update的时候可以对记录查询,但是查询出的结果可能就是update之前的值了。

Linux下消息队列学习(2)

一、消息队列系统参数设置
在Linux系统下有两个参数可以设置消息队列的大小:

vim /etc/sysctl.conf

加入:

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 6553600

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

参数说明:
kernel.msgmnb:每个消息队列的大小(字节)
kernel.msgmax:消息队列中一个消息的最大长度(字节)

按照以上设置,一个消息队列最大长度可以为6553600字节,每个消息最大长度65536字节,所以该消息队列可存储100条消息。

二、消息队列的特点
1)消息队列就是一个消息的链表。消息队列允许一个或多个进程向它写入或读取消息,而且消息是按消息类型访问与写入。如果读队列使用的消息类型为0,则读取消息队列中的第一条消息。
2)消息队列是随内核持续的,即当使用该消息队列的进程结束,或者已关闭该消息队列,该队列中的消息不会随之消失,只有在内核重新初始化,即计算机重启之后才会消失,因此成为内核的持续性,这点也是与管道和FIFO的区别。
3)消息队列的另一个特性是,在某一个进程往消息队列写消息之前不需要另外某个进程在该消息队列上等待消息的到达,即不会像管道、FIFO那样,如果往管道和FIFO写数据时,如果没有一个进程已经将读端打开,那么写操作会被阻塞。当然如果从消息队列读取数据时,消息队列为空时可以按设置的flag决定是否阻塞。
继续阅读Linux下消息队列学习(2)

20141228

昨天登上vps想给系统做下update,哪知道中美网络连接那么差,升到一半断线了,后来没在意,又重新升级。看到有安装kernal相关的软件包,于是就reboot。然后悲剧发生了,vps就启动不了了。最后重装系统,记住这次教训,以后做update一定要开screen!!!还好数据库在12月23日备份过一次,但是也丢了一篇文章和几条评论。。。

Linux下消息队列学习(1)

消息队列是进程间通讯的一种方法,一开始我以为消息队列是类似一个管道,一头连接一个进程、一头连接另一个进程,只能由这两个进程来进行互相的读写。其实这是错的,消息队列是系统层面的,它不属于某两个进程,它是由系统维护的一个链表结构。对消息队列的读写就是一个对链表的操作,默认是在链表的一端写数据,另一端读数据(先进先出),进程也可以取指定某种消息类型的消息。

在一个进程里创建了消息队列,且是可读可写的,那么系统中的所有进程都可以对它进行读写操作。

1、打开或创建一个消息队列
原型:int msgget(key_t key, int msgflg);
参数:
1)key :消息队列的key值。
2)msgflg:
IPC_CREAT:如果key对应的消息队列对象不存在,则创建;否则则进行打开操作,返回0。
IPC_EXCL:如果key对应的消息队列对象不存在,则返回-1;否则则进行打开操作,返回0。
权限控制:0666表示可读可写,和上面的IPC_CREAT做逻辑或操作。
返回值:
成功返回,创建的或打开的消息队列的id。
失败返回-1。

例子程序:test1.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>

int main(void)
{
	int msgid;
	printf("this is test1!\n");
	
	msgid = msgget(1001, 0666|IPC_CREAT);
	printf("msgid = %d\n", msgid);
	
	return 0;
}


继续阅读Linux下消息队列学习(1)

oracle spool命令

spool是sqlplus的内置命令,作用是将数据库中的字段导出为文本,一般都是通过shell脚本来实现。

举例:test.sh

#! /bin/sh

sqlplus -s scott/tiger<<EOF
	set head off
	set linesize 20000
	set echo off
	set feedback off
	set pagesize 0
	set termout off
	set trimout on
	set trimspool on
		spool /home/test.txt
			select empno || '|' || ename || '|' || job || '|' || 
			mgr || '|' || hiredate || '|' || sal || '|' || 
			comm || '|' || deptno from emp;
		spool off
		exit;
EOF


spool常用的设置:
set head off:输出域标题,缺省为on
set linesize 20000:linesize可以设置的大点,防止一行长度不够
set echo off:显示sqlplus中的每个sql命令本身,缺省为on
set feedback off:回显本次sql命令处理的记录条数,缺省为on
set pagesize 0:输出每页行数,缺省为24,为了避免分页,可设定为0
set termout off:显示脚本中的命令的执行结果,缺省为on
set trimout on:去除标准输出每行的拖尾空格,缺省为off
set trimspool on:去除重定向(spool)输出每行的拖尾空格,缺省为off

参考资料:
http://wallimn.iteye.com/blog/472182
http://wenku.baidu.com/link?url=UaJq13FHgH87D5wITX0zcS4XxB6GkPec8mkNIuDP5hWiPvmhk2L-5sEOgECU2xRAfosPnwh3bgPpPmHNTICtE1qxsTuxPaI4ktuu9EVQNcG