心海,心要像大海一样宽广 的个人资料张元照片日志列表 工具 帮助

日志


3月22日

fork()用法

cu上关于fork()函数的精辟分析

                                      
 

作者:ccf  发表于:2006-04-01 17:11:01


#include <unistd.h>;

#include <sys/types.h>;

main ()

{

   pid_t pid;

        pid=fork();

        if (pid < 0)

                printf("error in fork!");

        else if (pid == 0)

                printf("i am the child process, my process id is %dn",getpid());

        else

                printf("i am the parent process, my process id is %dn",getpid());


}

结果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285

我就想不到为什么两行都打印出来了,在我想来,不管pid是多少,都应该只有一行才对


 chg.s 回复于:2004-04-27 21:09:30


要搞清楚fork的执行过程,就必须先讲清楚操作系统中的“进程(process)”概念。一个进程,主要包含三个元素:

o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。

不妨简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。

一个称为“程序计数器(program counter, pc)”的寄存器,指出当前占用 CPU的进程要执行的下一条指令的位置。

当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换需要涉及到更多的数据,那和fork无关,不再多说,主要要记住程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。

好了,有这些概念打底,可以说fork了。当你的程序执行到下面的语句:
pid=fork(); 
操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!此时程序寄存器pc,在父、子进程的上下文中都声称,这个进程目前执行到fork调用即将返回(此时子进程不占有CPU,子进程的pc不是真正保存在寄存器中,而是作为进程上下文保存在进程表中的对应表项内)。问题是怎么返回,在父子进程中就分道扬镳。

父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),所以下面的if语句中pid<0, pid==0的两个分支都不会执行。所以输出i am the parent process...

子进程在之后的某个时候得到调度,它的上下文被换入,占据 CPU,操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程(注意这不是父进程了哦,虽然是同一个程序,但是这是同一个程序的另外一次执行,在操作系统中这次执行是由另外一个进程表示的,从执行的角度说和父进程相互独立)中pid=0。这个进程继续执行的过程中,if语句中pid<0不满足,但是pid==0是true。所以输出i am the child process...

我想你比较困惑的就是,为什么看上去程序中互斥的两个分支都被执行了。在一个程序的一次执行中,这当然是不可能的;但是你看到的两行输出是来自两个进程,这两个进程来自同一个程序的两次执行。

我的天,不知道说明白了没……
 

zhaojinbo 回复于:2004-04-28 12:35:50

fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。
可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。
至于那一个最先运行,可能与操作系统有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。


 sniper 回复于:2004-04-28 22:11:15

哦,偶明白了,在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。
在这里,我们可以这么认为,在运行到"pid=fork();"时系统派生出一个跟主程序一模一样的子进程。该进程的"pid=fork();"一句中pid得到的就是子进程本身的pid;子进程结束后,父进程的"pid=fork();"中pid得到的就是父进程本身的pid。因此改程序有两行输出。

注:此处不准确,在子进程中pid的值为0,通过getpid可以获取子进程的进程id;在父进程中pid为父进程编号。

勘误:父进程中的pid值为子进程进程号,只有父进程执行的getpid()才是他自己的进程号。寒,彻底的in 


jjl3 回复于:2004-07-14 11:43:20

我做如下修改

#include <unistd.h>; 
#include <sys/types.h>; 

main () 

        pid_t pid; 
        printf("fork!");    // printf("fork!n");
        pid=fork(); 

        if (pid < 0) 
                printf("error in fork!"); 
        else if (pid == 0) 
                printf("i am the child process, my process id is %dn",getpid()); 
        else 
                printf("i am the parent process, my process id is %dn",getpid()); 
}

 

结果是 
[root@localhost c]# ./a.out 
fork!i am the child process, my process id is 4286 
fork!i am the parent process, my process id is 4285

但我改成printf("fork!n");后,结果是
[root@localhost c]# ./a.out
fork! 
i am the child process, my process id is 4286 
i am the parent process, my process id is 4285

为什么只有一个fork!打印出来了?上一个为什么有2个?


 bashfulboy 回复于:2004-07-14 22:10:52

我也来一下:
wujiajia 的理解有些错误,
printf("AAAAAAAA");//print 一次;   这里会print 2次
如果你将 printf("AAAAAA") 换成 printf("AAAAAAn")   那么就是只打印一次了.
主要的区别是因为有了一个 n  回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf("AAAAAA") 后, AAAAAA 仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 AAAAAA 被子进程继承了
因此在子进程度stdout缓冲里面就也有了 AAAAAA.
所以,你最终看到的会是 AAAAAA 被printf了2次!!!!
而运行 printf("AAAAAAn")后, AAAAAA 被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!!

(精要)


 albcamus 回复于:2005-03-08 15:56:11

>;>;派生子进程的pid变量并没有被改变是什么意思 对于子进程来讲pid不就是0吗 

1,派生子进程的进程,即父进程,其pid不变;
2,对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;
3,楼上的楼上的你的观点是对的,fork之后夫子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。

10月31日

js(3)

/*

  IsFloat(string,string,int or string):(测试字符串,+ or - or empty,empty or 0)

  功能:判断是否为浮点数、正浮点数、负浮点数、正浮点数+0、负浮点数+0

*/


function IsFloat(objStr,sign,zero)

{

    var reg;    

    var bolzero;    

    

    if(Trim(objStr)=="")

    {

        return false;

    }

    else

    {

        objStr=objStr.toString();

    }    

    

    if((sign==null)||(Trim(sign)==""))

    {

        sign="+-";

    }

    

    if((zero==null)||(Trim(zero)==""))

    {

        bolzero=false;

    }

    else

    {

        zero=zero.toString();

        if(zero=="0")

        {

            bolzero=true;

        }

        else

        {

            alert("检查是否包含0参数,只可为(空、0)");

        }

    }

    switch(sign)

    {

        case "+-":

            //浮点数

            reg=/^((-?|\+?)\d+)(\.\d+)?$/;

            break;

        case "+": 

            if(!bolzero)           

            {

                //正浮点数

                reg=/^\+?(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

            }

            else

            {

                //正浮点数+0

                reg=/^\+?\d+(\.\d+)?$/;

            }

            break;

        case "-":

            if(!bolzero)

            {

                //负浮点数

                reg=/^-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

            }

            else

            {

                //负浮点数+0

                reg=/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/;

            }            

            break;

        default:

            alert("检查符号参数,只可为(空、+-)");

            return false;

            break;

    }

    

    var r=objStr.match(reg);

    if(r==null)

    {

        return false;

    }

    else

    {        

        return true;     

    }

}


 

js常用功能2

/*

验证类函数

*/


function IsEmpty(obj)

{

    obj=document.getElementsByName(obj).item(0);

    if(Trim(obj.value)=="")

    {

        alert("字段不能为空。");        

        if(obj.disabled==false && obj.readOnly==false)

        {

            obj.focus();

        }

    }

}


 

/*

  IsInt(string,string,int or string):(测试字符串,+ or - or empty,empty or 0)

  功能:判断是否为整数、正整数、负整数、正整数+0、负整数+0

*/


function IsInt(objStr,sign,zero)

{

    var reg;    

    var bolzero;    

    

    if(Trim(objStr)=="")

    {

        return false;

    }

    else

    {

        objStr=objStr.toString();

    }    

    

    if((sign==null)||(Trim(sign)==""))

    {

        sign="+-";

    }

    

    if((zero==null)||(Trim(zero)==""))

    {

        bolzero=false;

    }

    else

    {

        zero=zero.toString();

        if(zero=="0")

        {

            bolzero=true;

        }

        else

        {

            alert("检查是否包含0参数,只可为(空、0)");

        }

    }

    switch(sign)

    {

        case "+-":

            //整数

            reg=/(^-?|^\+?)\d+$/;            

            break;

        case "+": 

            if(!bolzero)           

            {

                //正整数

                reg=/^\+?[0-9]*[1-9][0-9]*$/;

            }

            else

            {

                //正整数+0

                //reg=/^\+?\d+$/;

                reg=/^\+?[0-9]*[0-9][0-9]*$/;

            }

            break;

        case "-":

            if(!bolzero)

            {

                //负整数

                reg=/^-[0-9]*[1-9][0-9]*$/;

            }

            else

            {

                //负整数+0

                //reg=/^-\d+$/;

                reg=/^-[0-9]*[0-9][0-9]*$/;

            }            

            break;

        default:

            alert("检查符号参数,只可为(空、+-)");

            return false;

            break;

    }

    var r=objStr.match(reg);

    if(r==null)

    {

        return false;

    }

    else

    {        

        return true;     

    }

}

js的常用功能

将下面代码保存为Common.js

  类库功能:

  1.Trim(str)--去除字符串两边的空格

  2.XMLEncode(str)--对字符串进行XML编码

  3.ShowLabel(str,str)--鼠标提示功能(显示字符,提示字符)

  可以设置显示的提示的文字的字体、颜色、大小以及提示的背景颜色、边框等

  4.IsEmpty(obj)--验证输入框是否为空

  5.IsInt(objStr,sign,zero)--验证是否为整数,正整数,负整数,以及是否包括零

  6.IsFloat(objStr,sign,zero)--验证是否为浮点数,正浮点,负浮点,以及是否包括零

  7.IsEnLetter(objStr,size)--验证是否为26个字母,大写小

  源代码如下:

/*

       名字:Common.js

       功能:通用javascript脚本函数库

       包括:

            1.Trim(str)--去除字符串两边的空格

            2.XMLEncode(str)--对字符串进行XML编码

            3.ShowLabel(str,str)--鼠标提示功能(显示字符,提示字符)

            4.IsEmpty(obj)--验证输入框是否为空

            5.IsInt(objStr,sign,zero)--验证是否为整数

            6.IsFloat(objStr,sign,zero)--验证是否为浮点数

            7.IsEnLetter(objStr,size)--验证是否为26个字母

*/

/*字符串操作

Trim(string):去除字符串两边的空格

*/

/*

  1.LTrim(string):去除左边的空格

*/


function LTrim(str)

{

    var whitespace = new String(" \t\n\r");

    var s = new String(str);

    

    if (whitespace.indexOf(s.charAt(0)) != -1)

    {

        var j=0, i = s.length;

        while (j < i && whitespace.indexOf(s.charAt(j)) != -1)

        {

            j++;

        }

        s = s.substring(j, i);

    }

    return s;

}

 

/*


  2.RTrim(string):去除右边的空格

*/


function RTrim(str)

{

    var whitespace = new String(" \t\n\r");

    var s = new String(str);

 

    if (whitespace.indexOf(s.charAt(s.length-1)) != -1)

    {

        var i = s.length - 1;

        while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)

        {

            i--;

        }

        s = s.substring(0, i+1);

    }

    return s;

}


 

/*

  3.Trim(string):去除前后空格

*/


function Trim(str)

{

    return RTrim(LTrim(str));

}

/*

  XMLEncode(string):对字符串进行XML编码

*/

function XMLEncode(str)

{

       str=Trim(str);

       str=str.replace("&","&amp;");

       str=str.replace("<","&lt;");

       str=str.replace(">","&gt;");

       str=str.replace("'","&apos;");

       str=str.replace("\"","&quot;");

       return str;

}

javascript检查

<script language="javascript">
          <!--
          
          function check_all()
          {
           if(window.document.add_user_form.user_name.value =="")
           {
            alert("请输入用户名!");
            window.document.add_user_form.user_name.focus();
            return false;
           }
           if(window.document.add_user_form.password.value =="")
           {
            alert("请输入用户密码!");
            window.document.add_user_form.password.focus();
            return false;
           }
           if(window.document.add_user_form.password.value!=window.document.add_user_form.repassword.value)
           {
            alert("两次输入的密码不一样,请重新输入");
            window.document.add_user_form.password.value="";
            window.document.add_user_form.repassword.value="";
            window.document.add_user_form.password.focus();
            return false;
           }
           
           
//           if(window.document.add_user_form.email.value.indexOf("@")==-1)
//           {
//            alert("请输入正确的email地址!");
//            window.document.add_user_form.email.value="";
//            window.document.add_user_form.email.focus();
//            return false;
//           }
           
           if(window.document.add_user_form.email.value.lastIndexOf("@")!=window.document.add_user_form.email.value.indexOf("@"))
           {
            alert("请输入正确的email地址!");
            window.document.add_user_form.email.value="";
            window.document.add_user_form.email.focus();
            return false;
           }
           if(isNaN(window.document.add_user_form.telephone.value))
           {
            alert("请输入数字!");
            window.document.add_user_form.telephone.value="";
            window.document.add_user_form.telephone.focus();
            return false;
           }
           if(isNaN(window.document.add_user_form.mobile.value))
           {
            alert("请输入数字!");
            window.document.add_user_form.mobile.value="";
            window.document.add_user_form.mobile.focus();
            return false;
           }
          }
          
          -->
          </script>

页面的自动刷新

<meta http-equiv='refresh' content='5'>代表每5秒页面自动刷新一次

linux命令学习

ps -e 查看所有进程
which ():在设定的目录里来查找()内容
find -name ():在当前的目录及子目录里来查找()
() |()后一个在前一个命令的前提下执行
 

php 和javascript的交互

php是服务器端的脚本 ,而js是客房端的脚本。
<script type="text/javascript">
 
  d = new dTree('d');
  d.add(0,-1,'目录','','','itwork_main');
  d.add(1,0,'设备日志管理','','','itwork_main');
  d.add(2,0,'IT资产管理','','','itwork_main');
  d.add(3,0,'系统设置','','','itwork_main');
//  d.add(4,0,'退出','logout.php','','_parent');
  d.add(5,1,'全部日志','all_log_management.php','','itwork_main');
  d.add(6,1,'网络设备日志','net_device_log_management.php','','itwork_main');
  d.add(7,1,'服务器日志','server_device_log_management.php','','itwork_main');
  d.add(8,1,'客户机日志','','','itwork_main');
  d.add(9,2,'设备信息管理','','','itwork_main');
  d.add(10,9,'网络资产','','','itwork_main');
  d.add(11,9,'服务器资产','','','itwork_main');
  d.add(12,9,'客户端资产','','','itwork_main');
  d.add(13,2,'设备视图管理','','','itwork_main');
  d.add(14,13,'全部设备','all_device_view.php','','itwork_main');
  d.add(15,13,'网络设备','net_device_view.php','','itwork_main');
  d.add(16,13,'服务器','server_device_view.php','','itwork_main');
  d.add(17,3,'用户管理','user_management.php','','itwork_main');
  d.add(18,3,'紧急事件','emergency_event.php','','itwork_main');
  d.add(19,3,'设备类型','device_type.php','','itwork_main');
  d.add(20,3,'IT资产信息','it_device.php','','itwork_main');
  
  <?php
  include("connect_db.php");
  $query="SELECT ZCBH,SBLX FROM IT_PROPERTY";
  $result=mysql_query($query,$conn);
  $i=21;
  while ($row=mysql_fetch_array($result)){
   $zcbh=$row[0];
   $sblx=$row[1];
   if($sblx!="服务器")
   {
  ?>
   d.add(<?php echo $i?>,10,'<?php echo $zcbh?>','','','itwork_main');
      d.add(<?php echo $i+1;?>,<?php echo $i;?>,'基本信息','device_info.php?zcbh=<?php echo $zcbh?>','','itwork_main');
      d.add(<?php echo $i+2;?>,<?php echo $i;?>,'SNMP信息','snmp_info.php?zcbh=<?php echo $zcbh?>','','itwork_main');
      d.add(<?php echo $i+3;?>,<?php echo $i;?>,'日志信息','device_log.php?zcbh=<?php echo $zcbh?>','','itwork_main');
   <?php
   }
   else
   {
    ?>
   d.add(<?php echo $i?>,11,'<?php echo $zcbh?>','','','itwork_main');
   d.add(<?php echo $i+1;?>,<?php echo $i;?>,'基本信息','device_info.php?zcbh=<?php echo $zcbh?>','','itwork_main');
   d.add(<?php echo $i+2;?>,<?php echo $i;?>,'SNMP信息','snmp_info.php?zcbh=<?php echo $zcbh?>','','itwork_main');
   d.add(<?php echo $i+3;?>,<?php echo $i;?>,'日志信息','device_log.php?zcbh=<?php echo $zcbh?>','','itwork_main'); 
   <?php
   }
   $i++;$i++;$i++;$i++;
  }
  ?>
  d.closeAll();
  document.write(d);
 </script>
 

九华山拜佛归来

这个周末我陪老婆家人到九华山玩去了。
  九华山在安徽省池州境内,是中国四大佛教胜地之一。中国的四大佛教名山是:山西的五台山、安徽的九华山、四川的峨嵋山、浙江的普陀山。山西五台山曾是文殊菩萨(大智菩萨)的道场、四川峨眉山曾是普贤菩萨(大行菩萨)的道场,浙江普陀山曾是观音菩萨(大慈大悲菩萨)的道场、安徽九华山曾是地藏菩萨(大愿菩萨)的道场。
     相传在公元916年间,古新罗国王子金乔觉远道来到九华以此作为他的修炼之地,修行了75年圆寂后,因其肉身不坏,以为他是地藏王菩萨的化身,而从此把九华山作为地藏王菩萨的道场。在香会期更是游人如织,纷至沓来朝拜地藏王菩萨。地藏王菩萨称为大愿地藏王菩萨,据《地藏十轮经》上说:地藏王菩萨“安忍不动犹如大地,静虑深思犹如秘藏。”所以称为地藏,因为地藏王菩萨曾经发下宏愿:“地狱不空,誓不成佛,度尽众生,方证菩提”,“我不入地狱,谁入地狱。”
    地藏王菩萨还有一个重大的责任,那就是在佛祖释迦牟呢佛圆寂和大肚弥勒菩萨未出世之间,接受释迦牟尼佛的嘱托,度尽六道众生。地藏王菩萨一般供在钟楼,闻钟声可以“轻烦恼,长智慧,生菩提”,撞钟则可以警戒十方,使那些受苦的众生早日离苦得乐。撞一百零八下就相处可以去掉人身上的一百零八个烦恼。
      地藏王菩萨手持如意明珠和锡杖,也是颇具含义:
         如意明珠寓意:明珠照彻天堂路,度尽你的一切烦恼苦厄,送你到佛教的最高境界西方极乐世界。
         锡杖:则为敲开地狱之门
      九华街,面积约4平方公里,是九华山的核心景区,为香客游人集散地。老街店铺、寺庙林立,僧俗共处,农禅并重,是九华山人文景观荟萃之地。有化城寺、放生池、无瑕肉身、慈明肉身、祇园寺、旃檀林、百岁宫、东崖禅寺、回香阁、肉身殿等景点多处。
        九华山海拔最高的景区,最高峰十王峰位于该景区。在约8平方公里的范围内,奇峰怪石, 峭壁危崖,高台幽洞,梵宫古刹,建有著名寺院地藏禅林、古拜经台、大悲院、观音峰上院、翠云庵、道僧洞等,可观天台、青龙背、罗汉墩、蜡烛峰、金龟朝北斗、观音峰、钵盂峰、宴仙台、捧日亭、无底洞、太极洞、古佛洞等百余处名胜景点。古人赞此地为"非人间"(摩崖石刻),意为登临天台,如入仙境。置身天台,北可见长江如游龙横卧江淮大地,南可观神奇黄山奇峰秀水,自古就有"不到天台,等于没来"之说。
       位于九华山风景区中心部位,紧邻九华街景区,由上闵园、中闵园、下闵园三部分构成,面积约6平方公里。清澈见底、婉延流淌的龙溪河纵贯闵园, 景区遍生松、杉、毛竹,珍贵树种有青钱柳、金钱松、珙桐、楠木等,富产灵芝、黄精、何首乌、丹皮、石蒜、黄莲、九死还魂草等野生药材,尤以大面积的“闵园竹海”和“天下第一奇松”──凤凰松最为诱人。深山密林之中,九华莲社、大悲莲社、接引庵、心愿茅蓬、香山茅蓬、净修茅蓬、莲宗精舍、慈佛精舍、潮音精舍等20余座尼庵或隐或现,“曲径通幽处,禅房花木深”,环境十分幽静。
9月29日

今年放假去福建玩了一圈1

今年暑假 公司里实习了1个月,9月1 号,终于放假了。
 
老板给我们发了800块。有钱了,有钱了。
 
之前,曾想过有空陪老婆去看海,现在正在还没有开学。想到做到,9。1晚,我们做上了开往厦门的2521,
 
9月3号早上5:40到了,传说中的厦门。从小长这么大还没有做过这么长时间的火车,这次做了31个小时。
 
(末完,待续)
7月31日

今天开始上班了

今天是第一天上班,早上6:30就起床了。
 
做班车到公司要一个小时,路上车开的很慢,一步几停的,很不舒服。
 
上班 也没有自己想像中的那么神圣。
 
一切还是那样啊
6月23日

好长时间 没有来了

 
  最近 事情很多,好长时间没有来更新我的space了 。
 
 
时间 过的很快,研一马上就要过完了。希望自己在下面的日子里,天天开心。
 
2月21日

开学了,

 
终于开学了,在家里,一个寒假 ,真是无聊。
 
 
没有事情做,整天除了看电视,就是看电视,整个人都懒了很多 。
 
一个寒假 在家里,每天什么事情都 不做,吃了早饭,吃中饭 ,然后就等着吃晚饭了,一个假期回来 我长了10斤啊,简直比小猪长的都 要快了,。
 
开学了,终于有点事情做了,希望自己在这个学期里,天天开心,愿老婆也天天开心。
 
12月31日

今天是我和女朋友3周年

我和女友在大一认识,那时我们并不是很熟,仅仅就是见面打个招呼而已。
 
从大一下,由于在一起上自习,我们开始熟起来。
 
我们经常出去逛街,谈心。我们无话不谈,彼此视为知己。
 
后来我发现自己真的喜欢上了她,爱上了她。
 
我表面上装作没有很刻意的去追她,但却经常为她的一句话而开心,又因为她的一句话而郁闷好几天
 
我开始帮她打开水,帮她做事。
 
我让宿舍的兄弟们帮我分析分析她在想什么,怎么才能获得她的青睐。后来事情向好的方向发展,我们之前的关系也越来越亲密,但我不敢向她表白,我害怕,害怕她会拒绝。
 
为此,我请我们宿舍的兄弟不知道吃了多少东西。我们宿舍的兄弟向我建议在圣诞夜带她出去玩通宵向她表白。
 
圣诞夜那天,我特意多穿了一件衣服,想晚上的时候如果她冷就给她披上。天公不作美,那天下雪,没有地方可以玩通宵,没有办法只好回学校。我回到宿舍,兄弟们还很奇怪,我怎么回来了。那几天很郁闷的。
 
机会再一次的来了,2003.12.31号下午,我们和她高中的同学一起去打保龄球,晚上和她们一起吃完饭后,我向她提意去湖南路转转吧。
 
这条路我不知道陪她走过多少次了,但这次不一样。我正想着怎么向她表白,这时有一个卖花的小姑娘过来,要我给她买花。我机灵一动,就想买一只吧,试探一下。
 
我买了一朵玫瑰花送给她,她没有拒绝,很高兴的接受了。我就问做我的女朋友好不好,她没有拒绝,我怕她会说不。于是,当时,我就一把搂住了她,搂着她的腰向前走。走了一段路,我看她没有拒绝我的意思。就牵起了她的手,那是我第一次牵女生的手,那感觉确定是<<第一次>>里所唱的那样,迷失了方向。
 
后来,我们来到了青春广场,在那里,我献出了我的初吻,时间是11:59分。当时那种感觉,就像是要我马上死掉,我也愿意。
 
那天我们是12点多回来的,学校的门已经关了,我和她一起把每一层门叫开,送她回去。然后自己再回去。回到宿舍 ,我还有点不敢相信,我们就这样开始了。
 
今天是我们在一起的3周年,我们和她在同一时间再次来到了那个地方,重温了一下,当年的情景。现在我们已经得到了双方家长的同意。我们的感情还是3年前一样的好。
 
虽然现在有时候我们也会吵架,但是这并不防碍我们之间的感情。 
我相信,我们会永远永远的在一起,我会永远永远的照顾她,用我的一生。
 

今天我生日,也是我一生的痛

又到了 1.1的生日
 
我妈说我是1.1号出生的,于是起名叫元。
 
我有时觉得自己很幸运,在这个好时间出生,但这一天同时也有我的伤痛,永远的痛。
 
记得从小时候起,每年的生日老爸老妈都会为过,不仅是因此我是家里的长子,还有的就是我的生日时
 
间比较好,这个时间是家里最闲的时间。记得每年生日的时候爸妈都 会做上一桌子的菜,都是我最爱
 
吃的。那时候每年都盼着生日的到来 。
 
好像是从高中开始,我的生日就没有在家里过了,但老爸老妈会做上好吃的东西到学校里来为我过生日。
 
同时不仅是生日,上了高中,住在学校里,每个星期老妈都 会到学校来看我,给我带好吃,而她却不舍得吃。
 
到了大学,记得那是大学的第一个生日,2002.1。1,那一天是我一生中都 不会忘记的日子。前一天老爸老妈打电话过来说今年不能亲自为我过生日了,让我在南京的姨妈为我过生日。他们还转达了我奶奶、外婆、外公对我的祝福。
 
第二天,我去我姨妈家的时候,我姨妈和姨夫都不在,我姨夫的弟弟为我过的生日,他说姨妈和姨夫因为家里有事回去了,我当时没有多想。
 
吃完饭,我大舅家的三妹妹过来,问我知不知道外公今天早上去世了。我听到这个消息,当时就呆住 了。昨天还给我通电话,祝我生日快乐的外公今天就没有了。
 
我当时就哭了出来,我不相信,我不相信。我立刻跑到旁边的电话厅,给家里打电话。电话接通了,我听到那边有哭声,但当我说我是张元时,哭声就停了。
 
我问是不是外公过世了,家里的人还骗我说没有,好好的,就是一点小病。
 
我说我知道了,为什么要骗我,为什么早上不通知我,为什么我没有能够见到我最亲爱的外公的最后一面。
 
我要回家,我当时做上公交车直奔火车站,我买了一辆最快的车,我要以最快的速度回到家,在外公还没有火化之前,再见他一面。
 
 
我是1号11半上的火车,2号凌晨3点到的徐州。由于要到7点才有到我家的车,我就在火车站外,寒风中站了4个小时。当时混身都冻的没有知觉了。
 
我8点钟回到了家,看到外公静静的躺在那里,再也不会听我说笑、不会把最好的东西留给我,再也不会听到我说话,再也不会为我牵挂了。我哭成了泪人。
 
见到了爸妈,老妈的眼睛已经哭得肿了。
 
老爸告诉我,奶奶也不行了,要我去看看吧。我从外公家回来,就直奔奶奶家。我到时,奶奶已经认不出我了,只是我叫了她一声,她应了一声。仿佛认出了我,但是已经不能说话了。
 
两天后,奶奶也去世了。
 
从1号到4号,我两位最亲的人连续离我而去。那是我一生中最惨淡的时光。
 
在我生日的那天外公的去世,也是我这辈子最大的痛,最深的痛。
 
今天是外公去世四周年了,再过3天,也是奶奶去世四周年了,我只有将心中的思念化为文字来表达我对外公、奶奶深深的悼念。
 
希望你们在天堂里活的开心,你们永远永远活在我的心中。
 
                               静书
                             2006.1。1
 
 
12月25日

写在圣诞节

昨天晚上和宿舍 的兄弟们去吃饭了,喝了三两酒,平时喝半斤也是没有什么问题的。
 
喝完了整个人就不行了,回到宿舍后,就倒下了,本来还说要陪老婆出去,平安夜啊,想想前两年都陪老婆。今年都觉得自己有点对不起她了。
 
我昨天只睡了5个小时,一大早就被老婆叫起来出去了。
 
 
哈哈,就当是我向她陪不是了。
 
我只希望自己可以永远陪她。
12月21日

宿舍的兄弟

今天宿舍的兄弟喝多了,我还戏弄他说到底还是年轻人啊,是啊,
 
看到宿舍的兄弟这个样子,我也觉得不好受,
 
为什么自己喜欢的人却没有机会在一起呢。
 
他一个人喝闷洒,我却不能劝他。唉,
 
命运弄人啊。。。。。。
 
 
 
 
12月5日

算法考完了

这几天太忙了,也很长时间没有到这里来了。
 
上个月,算法考试是一脱再脱,不过最后感觉自己考得还可以。最后一题现在说不算了,反正也没有做。
 
这期间,又和13班打了一场篮球赛,好长时间没有动了,自从准备考研,就把心收了,一是怕受伤,二是怕分心,现在终于有时间了。好好得运动了一下,感觉很好。
 
今天我又参加了羽毛球比赛,也是好长时间没有打了,不过还好,很多东西 自己还记得。
 
在1/8中,我参加的男双输了,自己感觉很郁闷。
 
在1/4中,我没有再犯错误,我们赢了,为班级做了一点自己的贡献。
11月22日

好长时间没有来了

最近一段时间都 没有来SPACE了。

 

马上算法就要考试了,要好好看书了。

 

这几天事情比较多,整天忙着看论文,写报告。

 

前几天夜里熬到3点看皇马的比赛,太让我失望了。

 

希望自己算法可以考出好成绩,这毕竟是研究生以来的第一次考试,不可以失误哦。

 

 

11月14日

最近的感想

 在几天里,发生了很多不愉快的事情,有的是自己的原因造成的,有些不知道是怎么回事。有时候,自己就在想,朋友到底是什么?爱情到底是什么?但却没有答案。
 
 我自己觉得,我是一个很豁达的人,对什么事情都想的很开,对什么事情都不是很在乎,但我知道,那只是我的外表。其实,我是一个很多愁善感的人,对朋友之间的友谊很在乎,对爱情很在乎。
 
 可是有些事情却是我自己不能控制的,我不是那种很善于表达自己情感的人。所以产,有时候,由于自己的原因,会失去一些朋友,每当我感觉自己失去他们的时候,我会很难过。
 
 前几天,我和老婆也大吵了一场,当时真的是有点想放弃了。但最终,我还是没有放得下这三年的感情。这几天我一直在作检讨,我自己,作为一个朋友,我有没有尽到做朋友应该做的,做为一个男朋友,我有没有尽到男朋友应该做的呢,我发现自己做的很不好。我是一个在实际行动中表达一切的人。所以有时候,一个话,我觉得没有必须说出来。但我发现我错了,有些话你不说,是没有人能体会的。
 
 今天,又有一很好的朋友远去了,原因有很多,但我想我的原因应该也有吧。
 
 人一辈子,知心的朋友没有几个。
 
 不要问朋友为你做了多少,而要问你为朋友 做了什么????