隨筆-20  評論-2  文章-0  trackbacks-0
            2009年7月16日
          **
           * <pre>
           * Title:         HttpRequestProxy.java
           * Project:     HP-Common
           * Type:        com.hengpeng.common.web.HttpRequestProxy
           * Author:        benl
           * Create:         2007-7-3 上午03:07:07
           * Copyright:     Copyright (c) 2007
           * Company:
           * <pre>
           */
          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.net.URLEncoder;
          import java.util.HashMap;
          import java.util.Iterator;
          import java.util.Map;
          import java.util.Map.Entry;

          import org.apache.log4j.Logger;

          /**
           * <pre>
           * HTTP請求代理類
           * </pre>
           *
           * @author benl
           * @version 1.0, 2007-7-3
           */
          public class HttpRequestProxy
          {
              /**
               * 連接超時
               */
              private static int connectTimeOut = 5000;

              /**
               * 讀取數據超時
               */
              private static int readTimeOut = 10000;

              /**
               * 請求編碼
               */
              private static String requestEncoding = "GBK";

              private static Logger logger = Logger.getLogger(HttpRequestProxy.class);

              /**
               * <pre>
               * 發送帶參數的GET的HTTP請求
               * </pre>
               *
               * @param reqUrl HTTP請求URL
               * @param parameters 參數映射表
               * @return HTTP響應的字符串
               */
              public static String doGet(String reqUrl, Map parameters,
                      String recvEncoding)
              {
                  HttpURLConnection url_con = null;
                  String responseContent = null;
                  try
                  {
                      StringBuffer params = new StringBuffer();
                      for (Iterator iter = parameters.entrySet().iterator(); iter
                              .hasNext();)
                      {
                          Entry element = (Entry) iter.next();
                          params.append(element.getKey().toString());
                          params.append("=");
                          params.append(URLEncoder.encode(element.getValue().toString(),
                                  HttpRequestProxy.requestEncoding));
                          params.append("&");
                      }

                      if (params.length() > 0)
                      {
                          params = params.deleteCharAt(params.length() - 1);
                      }

                      URL url = new URL(reqUrl);
                      url_con = (HttpURLConnection) url.openConnection();
                      url_con.setRequestMethod("GET");
                      System.setProperty("sun.net.client.defaultConnectTimeout", String
                              .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個,連接超時
                      System.setProperty("sun.net.client.defaultReadTimeout", String
                              .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
                      // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                      // 1.5換成這個,連接超時
                      // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
                      url_con.setDoOutput(true);
                      byte[] b = params.toString().getBytes();
                      url_con.getOutputStream().write(b, 0, b.length);
                      url_con.getOutputStream().flush();
                      url_con.getOutputStream().close();

                      InputStream in = url_con.getInputStream();
                      BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                              recvEncoding));
                      String tempLine = rd.readLine();
                      StringBuffer temp = new StringBuffer();
                      String crlf=System.getProperty("line.separator");
                      while (tempLine != null)
                      {
                          temp.append(tempLine);
                          temp.append(crlf);
                          tempLine = rd.readLine();
                      }
                      responseContent = temp.toString();
                      rd.close();
                      in.close();
                  }
                  catch (IOException e)
                  {
                      logger.error("網絡故障", e);
                  }
                  finally
                  {
                      if (url_con != null)
                      {
                          url_con.disconnect();
                      }
                  }

                  return responseContent;
              }

              /**
               * <pre>
               * 發送不帶參數的GET的HTTP請求
               * </pre>
               *
               * @param reqUrl HTTP請求URL
               * @return HTTP響應的字符串
               */
              public static String doGet(String reqUrl, String recvEncoding)
              {
                  HttpURLConnection url_con = null;
                  String responseContent = null;
                  try
                  {
                      StringBuffer params = new StringBuffer();
                      String queryUrl = reqUrl;
                      int paramIndex = reqUrl.indexOf("?");

                      if (paramIndex > 0)
                      {
                          queryUrl = reqUrl.substring(0, paramIndex);
                          String parameters = reqUrl.substring(paramIndex + 1, reqUrl
                                  .length());
                          String[] paramArray = parameters.split("&");
                          for (int i = 0; i < paramArray.length; i++)
                          {
                              String string = paramArray[i];
                              int index = string.indexOf("=");
                              if (index > 0)
                              {
                                  String parameter = string.substring(0, index);
                                  String value = string.substring(index + 1, string
                                          .length());
                                  params.append(parameter);
                                  params.append("=");
                                  params.append(URLEncoder.encode(value,
                                          HttpRequestProxy.requestEncoding));
                                  params.append("&");
                              }
                          }

                          params = params.deleteCharAt(params.length() - 1);
                      }

                      URL url = new URL(queryUrl);
                      url_con = (HttpURLConnection) url.openConnection();
                      url_con.setRequestMethod("GET");
                      System.setProperty("sun.net.client.defaultConnectTimeout", String
                              .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個,連接超時
                      System.setProperty("sun.net.client.defaultReadTimeout", String
                              .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
                      // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                      // 1.5換成這個,連接超時
                      // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
                      url_con.setDoOutput(true);
                      byte[] b = params.toString().getBytes();
                      url_con.getOutputStream().write(b, 0, b.length);
                      url_con.getOutputStream().flush();
                      url_con.getOutputStream().close();
                      InputStream in = url_con.getInputStream();
                      BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                              recvEncoding));
                      String tempLine = rd.readLine();
                      StringBuffer temp = new StringBuffer();
                      String crlf=System.getProperty("line.separator");
                      while (tempLine != null)
                      {
                          temp.append(tempLine);
                          temp.append(crlf);
                          tempLine = rd.readLine();
                      }
                      responseContent = temp.toString();
                      rd.close();
                      in.close();
                  }
                  catch (IOException e)
                  {
                      logger.error("網絡故障", e);
                  }
                  finally
                  {
                      if (url_con != null)
                      {
                          url_con.disconnect();
                      }
                  }

                  return responseContent;
              }

              /**
               * <pre>
               * 發送帶參數的POST的HTTP請求
               * </pre>
               *
               * @param reqUrl HTTP請求URL
               * @param parameters 參數映射表
               * @return HTTP響應的字符串
               */
              public static String doPost(String reqUrl, Map parameters,
                      String recvEncoding)
              {
                  HttpURLConnection url_con = null;
                  String responseContent = null;
                  try
                  {
                      StringBuffer params = new StringBuffer();
                      for (Iterator iter = parameters.entrySet().iterator(); iter
                              .hasNext();)
                      {
                          Entry element = (Entry) iter.next();
                          params.append(element.getKey().toString());
                          params.append("=");
                          params.append(URLEncoder.encode(element.getValue().toString(),
                                  HttpRequestProxy.requestEncoding));
                          params.append("&");
                      }

                      if (params.length() > 0)
                      {
                          params = params.deleteCharAt(params.length() - 1);
                      }

                      URL url = new URL(reqUrl);
                      url_con = (HttpURLConnection) url.openConnection();
                      url_con.setRequestMethod("POST");
                      System.setProperty("sun.net.client.defaultConnectTimeout", String
                              .valueOf(HttpRequestProxy.connectTimeOut));// (單位:毫秒)jdk1.4換成這個,連接超時
                      System.setProperty("sun.net.client.defaultReadTimeout", String
                              .valueOf(HttpRequestProxy.readTimeOut)); // (單位:毫秒)jdk1.4換成這個,讀操作超時
                      // url_con.setConnectTimeout(5000);//(單位:毫秒)jdk
                      // 1.5換成這個,連接超時
                      // url_con.setReadTimeout(5000);//(單位:毫秒)jdk 1.5換成這個,讀操作超時
                      url_con.setDoOutput(true);
                      byte[] b = params.toString().getBytes();
                      url_con.getOutputStream().write(b, 0, b.length);
                      url_con.getOutputStream().flush();
                      url_con.getOutputStream().close();

                      InputStream in = url_con.getInputStream();
                      BufferedReader rd = new BufferedReader(new InputStreamReader(in,
                              recvEncoding));
                      String tempLine = rd.readLine();
                      StringBuffer tempStr = new StringBuffer();
                      String crlf=System.getProperty("line.separator");
                      while (tempLine != null)
                      {
                          tempStr.append(tempLine);
                          tempStr.append(crlf);
                          tempLine = rd.readLine();
                      }
                      responseContent = tempStr.toString();
                      rd.close();
                      in.close();
                  }
                  catch (IOException e)
                  {
                      logger.error("網絡故障", e);
                  }
                  finally
                  {
                      if (url_con != null)
                      {
                          url_con.disconnect();
                      }
                  }
                  return responseContent;
              }

              /**
               * @return 連接超時(毫秒)
               * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
               */
              public static int getConnectTimeOut()
              {
                  return HttpRequestProxy.connectTimeOut;
              }

              /**
               * @return 讀取數據超時(毫秒)
               * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
               */
              public static int getReadTimeOut()
              {
                  return HttpRequestProxy.readTimeOut;
              }

              /**
               * @return 請求編碼
               * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
               */
              public static String getRequestEncoding()
              {
                  return requestEncoding;
              }

              /**
               * @param connectTimeOut 連接超時(毫秒)
               * @see com.hengpeng.common.web.HttpRequestProxy#connectTimeOut
               */
              public static void setConnectTimeOut(int connectTimeOut)
              {
                  HttpRequestProxy.connectTimeOut = connectTimeOut;
              }

              /**
               * @param readTimeOut 讀取數據超時(毫秒)
               * @see com.hengpeng.common.web.HttpRequestProxy#readTimeOut
               */
              public static void setReadTimeOut(int readTimeOut)
              {
                  HttpRequestProxy.readTimeOut = readTimeOut;
              }

              /**
               * @param requestEncoding 請求編碼
               * @see com.hengpeng.common.web.HttpRequestProxy#requestEncoding
               */
              public static void setRequestEncoding(String requestEncoding)
              {
                  HttpRequestProxy.requestEncoding = requestEncoding;
              }
             
              public static void main(String[] args)
              {
                  Map map = new HashMap();
                  map.put("actionType", "1");
          //        map.put("issueId", "33");
                  String temp = HttpRequestProxy.doPost("http://192.168.0.99/AgentPortal/autoHandler", map, "GBK");
                  System.out.println("返回的消息是:"+temp);
                 
              }
          }

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616102329953
          posted @ 2009-07-16 10:23 C.B.K 閱讀(1814) | 評論 (1)編輯 收藏

          /*

          下面的程序說明了怎樣實現對象序列化和反序列化。它由實例化一個MyClass類的對象開始。該對象有三個實例變量,它們的類型分別是String,int和double。這是我們希望存儲和恢復的信息。

          FileOutputStream被創建,引用了一個名為“serial”的文件。為該文件流創建一個ObjectOutputStream。ObjectOutputStream 的writeObject( )方法用來序列化對象。對象的輸出流被刷新和關閉。
          然后,引用名為“serial”的文件創建一個FileInputStream類并為該文件創建一個ObjectInputStream類。ObjectInputStream 的readObject( )方法用來反序列化對象。然后對象輸入流被關閉。
          注意MyClass被定義成實現Serializable接口。如果不這樣做,將會引發一個NotSerializableException異常。試圖做一些把MyClass實例變量聲明成transient的實驗。那些數據在序列化過程中不被保存

          */

          import java.io.*;
          class MyClass implements Serializable{
           String s;
           int i;
           double d;
           public MyClass (String s,int i,double d){
            this.s = s;
            this.i = i;
            this.d = d;
           }
           public String toString(){
            return "s=" + s + "; i=" + i + "; d=" + d;
           }
          }
          class SerializationDemo{
           public static void main(String[] args){
            //Object serialization.
            try{
             MyClass object1 = new MyClass("Evan",9,9.9e10);
             System.out.println("object1 : " +object1);
             FileOutputStream fos = new FileOutputStream("serial");
             ObjectOutputStream oos = new ObjectOutputStream(fos);
             oos.writeObject(object1);
             oos.flush();
             oos.close();
            }catch(Exception e){
             System.out.println("Exception during serialization :" + e);
             System.exit(0);
            }
            //Object deserialization.
            try{
             MyClass object2 ;
             FileInputStream fis = new FileInputStream("serial");
             ObjectInputStream ois = new ObjectInputStream(fis);
             object2 = (MyClass)ois.readObject();
             ois.close();
             System.out.println("object2 : " +object2);
            }catch(Exception e){
             System.out.println("Exception during serialization :" + e);
             System.exit(0);
            }
           }
          }


          文章來源:http://blog.163.com/ccbobo_cat/blog/static/320994622009616101541196
          posted @ 2009-07-16 10:16 C.B.K 閱讀(178) | 評論 (0)編輯 收藏
          Java的serialization提供了一種持久化對象實例的機制。當持久化對象時,可能有一個特殊的對象數據成員,我們不想
          用serialization機制來保存它。為了在一個特定對象的一個域上關閉serialization,可以在這個域前加上關鍵字transient。
          transient是Java語言的關鍵字,用來表示一個域不是該對象串行化的一部分。當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096161094144
          posted @ 2009-07-16 10:09 C.B.K 閱讀(162) | 評論 (0)編輯 收藏
            2009年7月10日

          匹配中文字符的正則表達式: [\u4e00-\u9fa5]
          匹配雙字節字符(包括漢字在內): [^\x00-\xff]

          應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
          String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
          匹配空行的正則表達式: \n[\s| ]*\r
          匹配HTML標記的正則表達式: /<(.*)>.*<\/>|<(.*) \/>/
          匹配首尾空格的正則表達式: (^\s*)|(\s*$)

          應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:
          String.prototype.trim = function() {
          return this.replace(/(^\s*)|(\s*$)/g, "");
          }


          利用正則表達式分解和轉換IP地址:
          下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的javascript程序:

          function IP2V(ip) {
          re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達式
          if(re.test(ip)) {
          return RegExp.*Math.pow(255,3))+RegExp.*Math.pow(255,2))+RegExp.*255+RegExp.*1
          }
          else {
          throw new Error("Not a valid IP address!")
          }
          }


          不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:

          var ip="10.100.20.168"
          ip=ip.split(".")
          alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
          匹配Email地址的正則表達式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
          匹配網址URL的正則表達式: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?


          利用正則表達式去除字串中重復的字符的算法程序:

          var s="abacabefgeeii"
          var s1=s.replace(/(.).*/g,"")
          var re=new RegExp("["+s1+"]","g")
          var s2=s.replace(re,"")
          alert(s1+s2) //結果為:abcefgi


          用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1

          s="http://www.9499.net/page1.htm"
          s=s.replace(/(.*\/)([^\.]+).*/ig,"")
          alert(s)


          利用正則表達式限制網頁表單里的文本框輸入內容:

          用正則表達式限制只能輸入中文:
          onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

          用正則表達式限制只能輸入全角字符:
          onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

          用正則表達式限制只能輸入數字:
          onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          用正則表達式限制只能輸入數字和英文:
          onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


          文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961005220547
          posted @ 2009-07-10 12:52 C.B.K 閱讀(218) | 評論 (0)編輯 收藏
          ant手冊中的ant配置classpath采用classpath標簽,可是我發現這樣配置總是不好用,還是直接用path可以使用
            設置classpath的方法有多種
          <path id="project.classpath">
              1<pathelement path="${basedir}/lib/aa.jar"/>
             2<pathelement location="aa.jar"/>與1的區別在于location可以去當前路徑,當然可以使用絕對路徑
              3<filelist id="file" dir="${basedir}/lin">
                    <file name="a.jar"/>
                    <file name="d:lib/b.jar"/>
               </filelist>
             4<fileset dir="d:/lib">
                 <include name="**/*.jar"/>
              </fileset>
             5手冊上說了dirset也好用,但是我測試了還是不要用的
          </path>   
            下面說classpath的使用
             樣例如下
               <javac scdir="./src" destdir="./classes">
                     <classpath refid="project.classpath"/> 
             </javac>


          下面是比較四種方式的優缺點
             第一種調用的需要設置絕對路徑適合第三方jar包
              第二種則適合jar包和build.xml文件在同一目錄下的情況,但是我覺得兩個文件放在一起本身就不合理,估計是用的情況不多。
            前兩個都是設置單個jar包
             第三種是一個文件集合適合引入不同路徑的jar包,但是需要輸入每個jar包的名字,比較繁瑣,適合于jar包屬于不同位置,比較分散但是不多的情況
            第四種是一個文件夾,可以采用匹配模式來引入,這個適合在同一個文件夾下,文件名字比較多的情況下

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200961051533899
          posted @ 2009-07-10 05:16 C.B.K 閱讀(1653) | 評論 (0)編輯 收藏
          ant的構建文件中,有很多核心類型,這些核心類型都是XXXSet的形式,主要有以下幾個:PatternSet、DirSet、FileSet、PropertySet、ZipFileSet等。說下前三個的功能就應該可以舉一反三了。
                    1.PatternSet  即模式集合。顧名思義,就是定義一個模式,他可以用來指定一個文件集合。常常可以被外部的target引用,復用性很強。有includes、 includesfile、excludes、excludesfile屬性。每個屬性里面還可以嵌套name、if、unless等類型。
                    2.DirSet  即目錄集合。用來定義目錄的集合。有dir、casesensitive、followsymlinks和PatternSet也有的那4個屬性。上面說過PatternSet可以很好的復用。下面就是一個例子:
          Xml代碼
          1. <dirset dir="${build.dir}">  
          2.                <patternset id="non.test.classes">  
          3.                       <include name="apps/**/classes"/>  
          4.                        <exclude name="apps/**/*Test*"/>  
          5.                 </patternset>  
          6.  </dirset>  
          <dirset dir="${build.dir}">
                         <patternset id="non.test.classes">
                                <include name="apps/**/classes"/>
                                 <exclude name="apps/**/*Test*"/>
                          </patternset>
           </dirset>
          
           

                  這是用patternset來定義DirSet的模式,這個模式還可以在外部引用。如:

          Xml代碼
          1. <dirset dir="{build.dir}">  
          2.                 <patternset refid="non.test.classes"/>  
          3. </dirset>  
            <dirset dir="{build.dir}">
                            <patternset refid="non.test.classes"/>
            </dirset>
           

                    上面定義了一個名為non.test.classes的PatternSet,現在就可以引用他了。refid即reference ID.
                    3.FileSet即文件集合,他的內部屬性與DirSet幾乎一樣,只是多了一個file和defaultexcludes。和dirset一樣,經常 嵌入patternset來定義文件集合;但是也有另外一個很常用的類型,叫selector,它并不是一個真正的類型或元素,只是一種、一類類型的統 稱。如contains、date、depend、depth、different、filename、present、containsregexp、 size、type等。


          文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096105521217
          posted @ 2009-07-10 05:05 C.B.K 閱讀(432) | 評論 (0)編輯 收藏
            2009年6月29日
          第一種方法:
          mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
          -> ON <dbname>.*
          -> TO <username>@<host name>
          -> IDENTIFIED BY '<password>';

          where <dbname> is the name of the database you are tyring to connect to, <username> is the username of the user trying to connect to the database, <host name> the name of the host (in your case the XXX host) and <password> the password of the user.
          第二種方法:
          通過客戶端軟件設置用戶的主機以及權限,
          message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客message from server: Host 80dc58cd93cd4c3 is not allowed to connect to this MySQL server - ccbobo_cat - 落壁の蜘蛛Μ的博客

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952925050579
          posted @ 2009-06-29 14:51 C.B.K 閱讀(1568) | 評論 (0)編輯 收藏
            2009年6月23日

          一、什么是條件變量

                 與互斥鎖不同,條件變量是用來等待而不是用來上鎖的。條件變量用來自動阻塞一個線程,直到某特殊情況發生為止。通常條件變量和互斥鎖同時使用。

                 條件變量使我們可以睡眠等待某種條件出現。條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動作:一個線程等待"條件變量的條件成立"而掛起;另一個線程使"條件成立"(給出條件成立信號)。

          條 件的檢測是在互斥鎖的保護下進行的。如果一個條件為假,一個線程自動阻塞,并釋放等待狀態改變的互斥鎖。如果另一個線程改變了條件,它發信號給關聯的條件 變量,喚醒一個或多個等待它的線程,重新獲得互斥鎖,重新評價條件。如果兩進程共享可讀寫的內存,條件變量可以被用來實現這兩進程間的線程同步。

                 使用條件變量之前要先進行初始化。可以在單個語句中生成和初始化一個條件變量如:

          pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;(用于進程間線程的通信)。

          也可以利用函數pthread_cond_init動態初始化。

           

          二、條件變量函數

          1

          名稱:

          pthread_cond_init

          目標:

          條件變量初始化

          頭文件:

          #include < pthread.h>

          函數原形:

          int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

          參數:

          cptr  條件變量

          attr  條件變量屬性

          返回值:

          成功返回0,出錯返回錯誤編號。

               

           

           

           

           

           

            pthread_cond_init函數可以用來初始化一個條件變量。他使用變量attr所指定的屬性來初始化一個條件變量,如果參數attr為空,那么它將使用缺省的屬性來設置所指定的條件變量。

           

          2.

          名稱:

          pthread_cond_destroy

          目標:

          條件變量摧毀

          頭文件:

          #include < pthread.h>

          函數原形:

          int pthread_cond_destroy(pthread_cond_t *cond);

          參數:

          cptr  條件變量

          返回值:

          成功返回0,出錯返回錯誤編號。

                

           

           

           pthread_cond_destroy函數可以用來摧毀所指定的條件變量,同時將會釋放所給它分配的資源。調用該函數的進程也并不要求等待在參數所指定的條件變量上。

           

          3.

          名稱:

          pthread_cond_wait/pthread_cond_timedwait

          目標:

          條件變量等待

          頭文件:

          #include < pthread.h>

          函數原形:

          int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

          int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime);

          參數:

          cond 條件變量

          mutex 互斥鎖

          返回值:

          成功返回0,出錯返回錯誤編號。

                

           

           

           

           

           

           

          第一個參數*cond是指向一個條件變量的指針。第二個參數*mutex則是對相關的互斥鎖的指針。函數pthread_cond_timedwait函數類型與函數pthread_cond_wait,區別在于,如果達到或是超過所引用的參數*abstime,它將結束并返回錯誤ETIME.pthread_cond_timedwait函數的參數*abstime指向一個timespec結構。該結構如下:

          typedef struct timespec{

                 time_t tv_sec;

                 long tv_nsex;

          }timespec_t;

           

          3.

          名稱:

          pthread_cond_signal/pthread_cond_broadcast

          目標:

          條件變量通知

          頭文件:

          #include < pthread.h>

          函數原形:

          int pthread_cond_signal(pthread_cond_t *cond);

          int pthread_cond_broadcast(pthread_cond_t *cond);

          參數:

          cond 條件變量

          返回值:

          成功返回0,出錯返回錯誤編號。

                

           

           

           

           

           參數*cond是對類型為pthread_cond_t 的一個條件變量的指針。當調用pthread_cond_signal時一個在相同條件變量上阻塞的線程將被解鎖。如果同時有多個線程阻塞,則由調度策略確定接收通知的線程。如果調用pthread_cond_broadcast,則將通知阻塞在這個條件變量上的所有線程。一旦被喚醒,線程仍然會要求互斥鎖。如果當前沒有線程等待通知,則上面兩種調用實際上成為一個空操作。如果參數*cond指向非法地址,則返回值EINVAL

           

          下面是一個簡單的例子,我們可以從程序的運行來了解條件變量的作用。

          #include <pthread.h>
          #include <stdio.h>
          #include <stdlib.h>

          pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*
          初始化互斥鎖*/
          pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*
          初始化條件變量*/

          void *thread1(void *);
          void *thread2(void *);

          int i=1;
          int main(void)
          {
              pthread_t t_a;
              pthread_t t_b;

              pthread_create(&t_a,NULL,thread2,(void *)NULL);/*
          創建進程t_a*/
              pthread_create(&t_b,NULL,thread1,(void *)NULL); /*
          創建進程t_b*/
              pthread_join(t_b, NULL);/*
          等待進程t_b結束*/
              pthread_mutex_destroy(&mutex);
              pthread_cond_destroy(&cond);
              exit(0);
          }

          void *thread1(void *junk)
          {
              for(i=1;i<=9;i++)
              {
                  pthread_mutex_lock(&mutex);/*
          鎖住互斥量*/
                  if(i%3==0)
                       pthread_cond_signal(&cond);/*
          條件改變,發送信號,通知t_b進程*/
                  else       
                       printf("thead1:%d\n",i);
                  pthread_mutex_unlock(&mutex);/*
          解鎖互斥量*/

          sleep(1);
          }

          }

          void *thread2(void *junk)
          {
              while(i<9)
              {
                  pthread_mutex_lock(&mutex);

          if(i%3!=0)
                      pthread_cond_wait(&cond,&mutex);/*
          等待*/
                  printf("thread2:%d\n",i);
                  pthread_mutex_unlock(&mutex);

          sleep(1);
          }

          }

          程序創建了2個新線程使他們同步運行,實現進程t_b打印20以內3的倍數,t_a打印其他的數,程序開始線程t_b不滿足條件等待,線程t_a運行使a循環加1并打印。直到i3的倍數時,線程t_a發送信號通知進程t_b,這時t_b滿足條件,打印i值。

          下面是運行結果:

          #cc –lpthread –o cond cond.c

          #./cond

          thread1:1

          thread1:2

          thread2:3

          thread1:4

          thread1:5

          thread2:6

          thread1:7

          thread1:8

          thread2:9


          文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095235658763
          posted @ 2009-06-23 17:07 C.B.K 閱讀(296) | 評論 (0)編輯 收藏
          工具:grub4dos0.4.2(想要的給我發信,我發給你,loveitdoit@163.com)

          文件:fedora7.0映像文件,可在網上下載。

          過程:

          1.解壓縮grub4dos0.4.2,把里面的 grldr和menu.lst,文件復制到c盤根目錄下。

          2.fedora7.0映像文件不必解壓,必須放在fat32的分區里。把里面的isolinux目錄下

          的VMLINUZ、INITRD.IMG解壓到c盤根目錄下。

          3.在c:\下找到menu.lst,用記事本打開并修改,刪除其他命令,添加以下命令!


          title Linux System Install

          kernel (hd0,0)/vmlinuz

          initrd (hd0,0)/initrd.img


          4.修改c:\boot.ini文件,在最后面添加c:\grldr="Start GRUB"并保存即可。

          5.重起系統,選擇Start GRUB,開始安裝。

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/3209946220095234437396
          posted @ 2009-06-23 16:05 C.B.K 閱讀(146) | 評論 (0)編輯 收藏
          花了半天時間研究了下下MYSQL的備份實現,發現其是在MY.CNF(MY.INI)配置文件中作的設置,直接設置服務器唯一性ID號加上其它的附加設 置,則可作為一臺MASTER,而在 SLAVE機上,也只需要在配置文件中設置一下連接MASTER所需的參數即可,如果在MASTER里也加上連到SLAVE機的參數,則就是雙向備份 了~~不過,這些連接參數中用到的賬號需要注意權限的設置,否則會搞半天沒反就急死你迪。。。
          我在WIN上和LINUX上各裝了MYSQL5,下面是它們的配置:
          WIN(172.22.33.33)下的MASTER(由于我改了端口3327所以下面多加了個端口方面的特殊處理了)的配置(my.ini):(**一定要在mysqld配置段中配置,不象PHP,APACHE可以隨便找個方便的地方配的,注意哈!!)

          [mysqld]
          #master 設置
          server-id=1
          log-bin=c:/masterlog
          binlog-do-db=db5

          #實現雙機備份段,給MASTER同時加上SLAVE段,可選哈,如果不選,那就是WIN到LIN的主從備份

          master-host=172.22.1.37
          master-user=backup2
          master-password=backup2
          master-port=3306
          master-connect-retry=60
          replicate-do-db=db5

          數據庫中加一個賬號:

          GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
          TO [email=backup@]backup@'172.22.1.37'[/email] IDENTIFIED by 'backup';
          這個權限表示,這個backup賬號只能由從備份機172.22.1.37訪問只能用來進行備份操作
          LINUX(172.22.1.37)下的SLAVE機的配置(把安裝目錄里找到的任意一個*.cnf拷到/etc/my.cnf下進行修改):

          server-id=2
          #如果不需要雙向備份下面兩行可以不要
          #否則還要加一個數據庫用戶賬號
          /*
          GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.*
          TO [email=backup2@]backup2@'172.22.33.33'[/email] IDENTIFIED by 'backup2';
          */
          log-bin=./masterlog
          binlog-do-db=db5
          #---------------------------------------
          master-host=172.22.33.33
          master-user=backup
          master-password=backup
          master-port=3327
          master-connect-retry=60
          replicate-do-db=db5
          由于只是大概的弄了一下,特別是在數據庫用戶方面沒有作仔細試驗:),可能會有所不太準確的地方,還有就是,上面測試用到的數據庫一定要是已經建立好并且 結構相同的,兩臺機子都重啟后會進行檢查,如果出現找不到或者檢查到結構不同,會報錯,最好就是在創建空數據庫時或初始時安裝兩個一樣的數據庫后就建立好 關系,對于不同版本的MYSQL,官方說明也可以同步,但想一想,把MYSQL5 的數據備份到4中去丟失5的特性也沒什么意義吧。。

          文章來源:http://blog.163.com/ccbobo_cat/blog/static/32099462200952335921779
          posted @ 2009-06-23 15:59 C.B.K 閱讀(222) | 評論 (0)編輯 收藏
          僅列出標題  下一頁
          主站蜘蛛池模板: 和林格尔县| 泸水县| 阜康市| 普兰店市| 新昌县| 永定县| 普安县| 永康市| 巴彦县| 高邮市| 白水县| 怀安县| 容城县| 景泰县| 林口县| 清徐县| 博湖县| 高雄市| 镇巴县| 汕头市| 确山县| 三门峡市| 桐乡市| 广灵县| 南华县| 建宁县| 津南区| 江北区| 广宁县| 泊头市| 即墨市| 延边| 舒城县| 大新县| 清徐县| 婺源县| 阳信县| 蓝山县| 大英县| 峨边| 恭城|