博文

Linux下的多线程编程(2007-07-05 10:39:00)

摘要: 1、 引言
  线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。
  为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题。
  使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。
  使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。
  除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:
  1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。
  2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的C......

阅读全文(1572) | 评论:0

信号(signal)介绍(2007-07-05 09:56:00)

摘要:信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。

一、信号的基本概念

本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和信号对应的事件。基本概念对于理解和使用信号,对于理解信号机制都特别重要。下面就来看看什么是信号。

1、基本概念

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。

2、信号的类型

发出信号的原因很多,这里按发出信号的原因简单分类,以了解各种信号:

(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
(4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并......

阅读全文(1633) | 评论:0

XMLHttpRequest对象的属性和方法(2007-06-11 09:06:00)

摘要: XMLHttpRequest对象的属性和方法 IE5.0开始,开发人员可以在Web页面内部使用XMLHTTP ActiveX组件扩展自身的功能,不用从当前的Web页面导航就可以直接将数据传输到服务器或者从服务器接收数据。Mozilla1.0以及NetScape7则是创建继承XML的代理类XMLHttpRequest;对于大多数情况,XMLHttpRequest对象和XMLHttp组件很相似,方法和属性类似,只是部分属性不同。例程4-25的代码段显示了如何在IE浏览器和Mozilla浏览器中创建XMLHttp- Request对象。 例程4-25  创建XMLHttpRequest对象 <script language="javascript"> var http_request = false; //IE 浏览器 http_request = new ActiveXObject("Msxml2.XMLHTTP"); http_request = new ActiveXObject("Microsoft.XMLHTTP"); //Mozilla 浏览器 http_request = new XMLHttpRequest(); </script> 不同版本的IE浏览器采用不同方式创建XMLHttpRequest对象,某些旧版本使用Microsoft.XMLHTTP,而较新的版本则使用Msxml2.XMLHTTP。通常,为了保证Ajax程序的浏览器兼容性,需要注意创建XMLHttpRequest对象的程序,要同时支持这两种创建方式。 XMLHttpRequest对象提供了一系列属性和方法,来向服务器发起异步http请求,监听服务器的状态,并在服务器完成数据响应处理之后接收服务器返回的信息数据。表4-17列出了XMLHttpRequest对象的属性。 表4-17  XMLHttpRequest对象属性 属    性 描    述 onreadystatechange 指定当readyState属性改变时的事件处理句柄,属性为只写 readyState 返回当前......

阅读全文(3175) | 评论:0

典型HTTP请求头(2006-07-09 20:26:00)

摘要:POST /search.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://www.ip138.com:8080/search.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded..Accept-Encoding: gzip, deflate
User_Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: www.ip138.com:8080
Content-Length: 28
Connection: Keep-Alive
Cookie: Cache-Control: no-cache

mobile=1340532&action=mobile

......

阅读全文(2385) | 评论:0

HTTP 错误代码含义(2006-07-09 20:25:00)

摘要:"100" : Continue "101" : witching Protocols "200" : OK "201" : Created "202" : Accepted "203" : Non-Authoritative Information "204" : No Content "205" : Reset Content "206" : Partial Content "300" : Multiple Choices "301" : Moved Permanently "302" : Found "303" : See Other "304" : Not Modified "305" : Use Proxy "307" : Temporary Redirect "400" : Bad Request "401" : Unauthorized "402" : Payment Required "403" : Forbidden "404" : Not Found "405" : Method Not Allowed "406" : Not Acceptable "407" : Proxy Authentication Required "408" : Request Time-out "409" : Conflict "410" : Gone "411" : Length Required "412" : Precondition Failed "413" : Request Entity Too Large "414" : Request-URI Too Large "415" : Unsupported Media Type "416" : Requested range not satisfiable "417" : Expectation Failed "500" : Internal Server Error "501" : Not Implemented "502" : Bad Gateway "503" : Service U......

阅读全文(2270) | 评论:0

SQL触发器和存储过程实例(2006-06-27 15:43:00)

摘要:CREATE TRIGGER PK02 ON [dbo].[jobs] FOR INSERT AS
DECLARE @ID as int,
@SrcMobileID as nvarchar(15),
@DestMobileID as nvarchar(15),
@MsgContent as nvarchar(255),
@ArrtTime as datetime

select @ID = ID, @SrcMobileID=SrcMobileID, @DestMobileID= DestMobileID, @MsgContent= MsgContent, @ArrtTime= ArrtTime
from smsIn
where id=(select max(ID) from smsin)

---转储以PK开头发送到02的短信
if right(@DestMobileID,2)='02' and UPPER(left(@MsgContent,2))='PK' begin
    select @MsgContent = right(@MsgContent,len(@MsgContent)-2)
    if (select count(*) from tbl_02PK where SrcMobileID= @SrcMobileID)<30
        insert into tbl_02PK (smsin_id,SrcMobileID,DestMobileID,keyword,MsgContent,ArrtTime)
        values(@ID, @SrcMobileID, @DestMobileID, 'PK', @MsgContent, @ArrtTime)
end




DECLARE @ID as int,
@SrcMobileID as nvarchar(15),
@DestMobileID as nv......

阅读全文(3127) | 评论:0

ASP查询XML输出(2006-06-15 17:27:00)

摘要:<%
 'IP检查
 ip=Request.ServerVariables("REMOTE_ADDR")
 IF ip<>"211.151.23.203" Then Response.End
 Dim conn
 Set conn = Server.CreateObject("ADODB.Connection")
 'SQL Server数据库链接
 Dim StrServer,StrUid,StrSaPwd,StrDbName,StrDSN
 StrServer ="61.156.25.37" '数据库服务器名
 StrUid  ="lyhousedx"  '您的登录帐号
 StrSaPwd ="admin_insert" '您的登录密码
 StrDbName ="yangchengzhi"  '您的数据库名称
 StrDSN  ="driver={SQL server};server="&StrServer&";uid="&StrUid&";pwd="&StrSaPwd&";database="&StrDbName
 '建立数据库链接
 conn.Open StrDSN
    set Tmp=server.createobject("adodb.recordset")
    sql = request("sql")
    'response.write sql
    Tmp.open sql,conn,1,1
    ReDim FieldsName(Tmp.Fields.Count)
    For i=0 to Tmp.Fields.Count-1
     &......

阅读全文(205) | 评论:0

Unicode转GB2312编码码表(程序用)(2006-02-28 15:42:00)

摘要:00A4 A1E8
00A7 A1EC
00A8 A1A7
00B0 A1E3
00B1 A1C0
00B7 A1A4
00D7 A1C1
00E0 A8A4
00E1 A8A2
00E8 A8A8
00E9 A8A6
00EA A8BA
00EC A8AC
00ED A8AA
00F2 A8B0
00F3 A8AE
00F7 A1C2
00F9 A8B4
00FA A8B2
00FC A8B9
0101 A8A1
0113 A8A5
011B A8A7
012B A8A9
014D A8AD
016B A8B1
01CE A8A3
01D0 A8AB
01D2 A8AF
01D4 A8B3
01D6 A8B5
01D8 A8B6
01DA A8B7
01DC A8B8
02C7 A1A6
02C9 A1A5
0391 A6A1
0392 A6A2
0393 A6A3
0394 A6A4
0395 A6A5
0396 A6A6
0397 A6A7
0398 A6A8
0399 A6A9
039A A6AA
039B A6AB
039C A6AC
039D A6AD
039E A6AE
039F A6AF
03A0 A6B0
03A1 A6B1
03A3 A6B2
03A4 A6B3
03A5 A6B4
03A6 A6B5
03A7 A6B6
03A8 A6B7
03A9 A6B8
03B1 A6C1
03B2 A6C2
03B3 A6C3
03B4 A6C4
03B5 A6C5
03B6 A6C6
03B7 A6C7
03B8 A6C8
03B9 A6C9
03BA A6CA
03BB A6CB
03BC A6CC
03BD A6CD
03BE A6CE
03BF A6CF
03C0 A6D0
03C1 A6D1

阅读全文(6878) | 评论:0

Unicode转GB2312编码C语言源程序(原创)(2006-02-28 15:14:00)

摘要:#include <stdio.h>
#include <string.h>
#include <ctype.h>
int H2D(char c){
 switch (toupper(c))
 {
  case 'A': return 10;
  case 'B': return 11;
  case 'C': return 12;
  case 'D': return 13;
  case 'E': return 14;
  case 'F': return 15;
 }
 return (c-'0');
} unsigned short tbl[65535];
void u2gb(unsigned char *u,unsigned char *gb){
 int i,j=0;
 unsigned char l,h;
 for(i=0;i<=strlen(u);){
  l=u[i++];
  h=u[i++];
  if(l==0 && h==0) break;
  if(l<0xA4 && h<=0){
   gb[j++]=l;
   continue;
  }
  gb[j++]=tbl[h*0x100+l]/0x100;
  gb[j++]=tbl[h*0x100+l]%0x100;
 }
 gb[j++]=0;
} int init_u2gb(){
 FILE *fd;
 int size;
 char buffer[10];
&n......

阅读全文(8992) | 评论:2

java访问Oracle数据库(转)(2005-11-04 14:57:00)

摘要:J2EE应用中与Oracle数据库的连接
作者:洪建
  在J2EE应用程序开发中,应用程序与数据库连接的建立是我们经常遇到的问题之一。在这里我主要谈谈在本地应用程序中通过OCI方式、thin方式和 JdbcOdbc桥方式连接Oracle数据库,在iPlanet Application Server 6.5和Sun ONE Application Server 7中对Oracle数据库连接池的配置以及应用中如何从连接池中获得连接。
一、本地通过JDBC获得Oracle数据库连接
  通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果 在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源 的配置,这种方式一般不太被采用。
1、OCI方式
  先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip文件,我们在环境变量classpath中设置classes12.zip所在的路径。
  然后通过以下的数据库连接类,在本地通过OCI方式获得Oracle数据库连接。
/**
* 在本地获得数据库连接
*/
package com.j2ee.db;
import java.util.*;
import java.sql.*; import javax.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
import javax.naming.*;
/**
* 通过OCI方式获得Oracle数据库连接
*/
public class DbConnection
{
  final static String sDBDriver = "oracle.jdbc.driver.OracleDriver";
  final static String sConnSt......

阅读全文(6627) | 评论:0