<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cyher.NET &#187; Programming</title>
	<atom:link href="http://cyher.net/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://cyher.net</link>
	<description>Technology, Life, Code, OpenSource, *nix, Mac and iphone, Mobile development</description>
	<lastBuildDate>Mon, 13 Feb 2012 10:12:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>linux进程可执行文件的绝对路径</title>
		<link>http://cyher.net/programming/linux-process-absolute-path</link>
		<comments>http://cyher.net/programming/linux-process-absolute-path#comments</comments>
		<pubDate>Thu, 24 Sep 2009 08:55:46 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[GNU/linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[proc]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=637006</guid>
		<description><![CDATA[这种情况很少遇到，我们需要一个运行中进程的绝对路径，可惜的是glibc中或者系统调用中我都没有找到类似的函数。但是linux绝对不会不给你这个机会的，那就是proc文件系统了。在proc文件系统中那些数字都是运行中的进程，进入一个文件名为数字的文件夹以后，我们就可以发现以下类似文件目录结构。 &#91;cyher@cyher ~&#93;$ ls /proc/3355/ attr             cpuset   io        mountinfo   pagemap      smaps    task auxv             cwd      latency   mounts      personality  stack    wchan cgroup           environ  limits    mountstats  root         stat clear_refs       exe      loginuid  net         sched        statm cmdline          fd       maps      oom_adj     schedstat    status coredump_filter  fdinfo   mem       oom_score   sessionid    syscall 这里就是一个进程所有的信息了大名鼎鼎的ps命令就是读取这里的内容解析出信息的，这里是ps的官方网站 http://procps.sourceforge.net/ 那好了，就用这里给的信息来解析出执行文件的绝对路径吧 /* * ===================================================================================== * * Filename: get_exe_path.c * * [...]]]></description>
			<content:encoded><![CDATA[<p>这种情况很少遇到，我们需要一个运行中进程的绝对路径，可惜的是glibc中或者系统调用中我都没有找到类似的函数。但是linux绝对不会不给你这个机会的，那就是proc文件系统了。在proc文件系统中那些数字都是运行中的进程，进入一个文件名为数字的文件夹以后，我们就可以发现以下类似文件目录结构。</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>cyher@cyher ~<span style="color: #009900;">&#93;</span>$ ls <span style="color: #339933;">/</span>proc<span style="color: #339933;">/</span><span style="color: #0000dd;">3355</span><span style="color: #339933;">/</span>
attr             cpuset   io        mountinfo   pagemap      smaps    task
auxv             cwd      latency   mounts      personality  stack    wchan
cgroup           environ  limits    mountstats  root         stat
clear_refs       exe      loginuid  net         sched        statm
cmdline          fd       maps      oom_adj     schedstat    status
coredump_filter  fdinfo   mem       oom_score   sessionid    syscall</pre></div></div>

<p>这里就是一个进程所有的信息了大名鼎鼎的ps命令就是读取这里的内容解析出信息的，这里是ps的官方网站 <a href="http://procps.sourceforge.net/" target="_blank">http://procps.sourceforge.net/</a></p>
<p>那好了，就用这里给的信息来解析出执行文件的绝对路径吧</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
 * =====================================================================================
 *
 *       Filename:  get_exe_path.c
 *
 *    Description:
 *
 *        Version:  1.0
 *        Created:  2009年09月23日 17时07分17秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  cyher (), cyher.net@gmail.com
 *        Company:  cyher.net
 *
 * =====================================================================================
 */</span>
&nbsp;
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#define BUF 128</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> agrc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span>BUF<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> proc<span style="color: #009900;">&#91;</span>BUF<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
&nbsp;
    sprintf<span style="color: #009900;">&#40;</span>proc<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/proc/%d/exe&quot;</span><span style="color: #339933;">,</span> atoi<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    readlink<span style="color: #009900;">&#40;</span>proc<span style="color: #339933;">,</span>buf<span style="color: #339933;">,</span> BUF<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*proc/pid/exe 是一个链接，用readlink读*/</span>
    p <span style="color: #339933;">=</span> strchr<span style="color: #009900;">&#40;</span>buf<span style="color: #339933;">,</span><span style="color: #ff0000;">'('</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/*读出的路径后面有可能会有 (deleted)字样，删去*/</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>p ！<span style="color: #339933;">=</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        p<span style="color: #339933;">--;</span>
        <span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    puts<span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>这样就能读取出绝对路径了，不过你首先要知道pid啊 呵呵。</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/linux-process-absolute-path/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>mysql C API(上)</title>
		<link>http://cyher.net/programming/mysql-c-api%e4%b8%8a</link>
		<comments>http://cyher.net/programming/mysql-c-api%e4%b8%8a#comments</comments>
		<pubDate>Sun, 22 Feb 2009 13:46:50 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=636894</guid>
		<description><![CDATA[Mysql,是开源界很有名的数据库,LAMP这种组合也是在web服务器领域很流行.也就是说,我们经常用的API都是一些web编程语言如:php,java,pyhton这些语言来和mysql通信,但是要是用c语言呢,我也就小小的研究一下. 文章参考: mysql中文手册在线版 http://imysql.cn/docs/MySQL_51_zh/mysql_51.html 当你看完手册的时候,会发现,c语言也能像php一样      query = "select * from test"; mysql_query(query); 类似的语句,执行查询等数据库操作.但是C语言有一种更常用的方法,更好的方法.我们为什么用C,效率第一,所以看下面.  为什么要用预处理？ 答：MySQL客户端／服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句，预处理执行是一种有效的方式。首先对语句进行解析，为执行作好准备。接下来，在以后使用初始化函数返回的语句句柄执行一次或多次。 对于多次执行的语句，预处理执行比直接执行快，主要原因在于，仅对查询执行一次解析操作。在直接执行的情况下，每次执行语句时，均将进行查询。此外，由于每次执行预处理语句时仅需发送参数的数据，从而减少了网络通信量。 预处理语句的另一个优点是，它采用了二进制协议，从而使得客户端和服务器之间的数据传输更有效率。 下述语句可用作预处理语句：CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中，不支持其他语句。 下面就把我的测试程序贴出来,是完成数据库的插入一条记录: 测试数据表结构： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +------------------+--------------+------+-----+---------+----------------+ &#124; Field            &#124; Type         &#124; Null &#124; Key &#124; Default &#124; Extra          &#124; +------------------+--------------+------+-----+---------+----------------+ &#124; USER_ID          &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>Mysql,是开源界很有名的数据库,LAMP这种组合也是在web服务器领域很流行.也就是说,我们经常用的API都是一些web编程语言如:php,java,pyhton这些语言来和mysql通信,但是要是用c语言呢,我也就小小的研究一下.</p>
<div>文章参考:<br />
mysql中文手册在线版</div>
<div><a href="http://imysql.cn/docs/MySQL_51_zh/mysql_51.html">http://imysql.cn/docs/MySQL_51_zh/mysql_51.html</a></div>
<div>当你看完手册的时候,会发现,c语言也能像php一样</div>
<div>    </div>
<div>
<pre lang="c",line="1">query = "select * from test";
mysql_query(query);</pre>
</div>
<div>类似的语句,执行查询等数据库操作.但是C语言有一种更常用的方法,更好的方法.我们为什么用C,效率第一,所以看下面. </div>
<p>为什么要用预处理？</p>
<p>答：MySQL客户端／服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句，预处理执行是一种有效的方式。首先对语句进行解析，为执行作好准备。接下来，在以后使用初始化函数返回的语句句柄执行一次或多次。</p>
<p>对于多次执行的语句，预处理执行比直接执行快，主要原因在于，仅对查询执行一次解析操作。在直接执行的情况下，每次执行语句时，均将进行查询。此外，由于每次执行预处理语句时仅需发送参数的数据，从而减少了网络通信量。</p>
<p>预处理语句的另一个优点是，它采用了二进制协议，从而使得客户端和服务器之间的数据传输更有效率。</p>
<p>下述语句可用作预处理语句：CREATE TABLE、DELETE、DO、INSERT、REPLACE、SELECT、SET、UPDATE、以及大多数SHOW语句。在MySQL 5.1中，不支持其他语句。<br />
下面就把我的测试程序贴出来,是完成数据库的插入一条记录:</p>
<div>测试数据表结构：</div>
<div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">+------------------+--------------+------+-----+---------+----------------+</span>
<span style="color: #339933;">|</span> Field            <span style="color: #339933;">|</span> Type         <span style="color: #339933;">|</span> Null <span style="color: #339933;">|</span> Key <span style="color: #339933;">|</span> Default <span style="color: #339933;">|</span> Extra          <span style="color: #339933;">|</span>
<span style="color: #339933;">+------------------+--------------+------+-----+---------+----------------+</span>
<span style="color: #339933;">|</span> USER_ID          <span style="color: #339933;">|</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span>      <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span> PRI <span style="color: #339933;">|</span> NULL    <span style="color: #339933;">|</span> auto_increment <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> USERNAME         <span style="color: #339933;">|</span> varchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">25</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> NULL    <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> PASSWORD         <span style="color: #339933;">|</span> varchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">25</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> NULL    <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> ARK_GROUP_ID     <span style="color: #339933;">|</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span>      <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> NULL    <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> PURVIWE_GROUP_ID <span style="color: #339933;">|</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span>      <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> NULL    <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> DESCRIPT         <span style="color: #339933;">|</span> varchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> YES  <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span>         <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> USER_POLICY      <span style="color: #339933;">|</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">11</span><span style="color: #009900;">&#41;</span>      <span style="color: #339933;">|</span> YES  <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> <span style="color: #0000dd;">0</span>       <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> MAIL             <span style="color: #339933;">|</span> varchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">50</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">|</span> YES  <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span>         <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> PHONE            <span style="color: #339933;">|</span> varchar<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">15</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">|</span> YES  <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span>         <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">|</span> LEVEL            <span style="color: #339933;">|</span> <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>       <span style="color: #339933;">|</span> NO   <span style="color: #339933;">|</span>     <span style="color: #339933;">|</span> <span style="color: #0000dd;">0</span>       <span style="color: #339933;">|</span>                <span style="color: #339933;">|</span>
<span style="color: #339933;">+------------------+--------------+------+-----+---------+----------------+</span></pre></td></tr></table></div>

</div>
<div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*************************************************************************************
 *                                                                                     
 *       Filename:  mysqltest.h 
 *    Description:    
 *                                                                                     
 *        Version:  1.0 
 *        Created:  2009年02月16日 16时15分20秒 
 *       Revision: 
 *       Compiler:  gcc 
 * 
 *         Author:  cyher (), cyher.net@gmail.com 
 *        Company:  cyher.NET 
 *                                                                                     
 **************************************************************************************/</span> 
&nbsp;
<span style="color: #339933;">#ifndef MYSQLTEST_H</span>
<span style="color: #339933;">#define MYSQLTEST_H</span>
&nbsp;
<span style="color: #339933;">#define OK 0</span>
<span style="color: #339933;">#define ERROR -1</span>
<span style="color: #993333;">struct</span> user_info <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">int</span> ark_grp<span style="color: #339933;">;</span> 
        <span style="color: #993333;">int</span> puv_grp<span style="color: #339933;">;</span> 
        <span style="color: #993333;">int</span> level<span style="color: #339933;">;</span> 
        <span style="color: #993333;">char</span> name<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">25</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>   
        <span style="color: #993333;">char</span> pswd<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">25</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> init_datebase<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> my_insert<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> user_info <span style="color: #339933;">*</span> user<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

</div>
<div>
<div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">**********************************************************</span>
 <span style="color: #339933;">*</span>                                                                                     
 <span style="color: #339933;">*</span>       Filename<span style="color: #339933;">:</span>  mysqltest.<span style="color: #202020;">c</span> 
 <span style="color: #339933;">*</span>    Description<span style="color: #339933;">:</span>  mysql 
 <span style="color: #339933;">*</span>                                                                                     
 <span style="color: #339933;">*</span>        Version<span style="color: #339933;">:</span>  <span style="color:#800080;">1.0</span> 
 <span style="color: #339933;">*</span>        Created<span style="color: #339933;">:</span>  <span style="color: #0000dd;">2009</span>年<span style="color: #208080;">02</span>月<span style="color: #0000dd;">16</span>日 <span style="color: #0000dd;">15</span>时<span style="color: #0000dd;">19</span>分<span style="color: #0000dd;">39</span>秒 
 <span style="color: #339933;">*</span>       Revision<span style="color: #339933;">:</span> 
 <span style="color: #339933;">*</span>       Compiler<span style="color: #339933;">:</span>  gcc 
 <span style="color: #339933;">*</span> 
 <span style="color: #339933;">*</span>         Author<span style="color: #339933;">:</span>  cyher <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> cyher.<span style="color: #202020;">net</span>@gmail.<span style="color: #202020;">com</span> 
 <span style="color: #339933;">*</span>        Company<span style="color: #339933;">:</span>  cyher.<span style="color: #202020;">NET</span> 
 <span style="color: #339933;">*</span>                                                                                     
 <span style="color: #339933;">***********************************************************/</span> 
&nbsp;
<span style="color: #339933;">#include                              /* mysql库 */ </span>
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include</span>
<span style="color: #339933;">#include &quot;mysqltest.h&quot;</span>
&nbsp;
MYSQL my_sql<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> init_datebase<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        my_bool on <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> 
&nbsp;
        mysql_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
     <span style="color: #808080; font-style: italic;">/* MYSQL_OPT_RECONNECT如果发现连接丢失，启动或禁止与服务器的自动再连接。从MySQL 5.0.3 
          * 开始，默认情况下禁止再连接，这是5.0.13中的新选项， 
          * 提供了一种以显式方式设置再连接行为的方法。 */</span> 
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">!=</span> mysql_options<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #339933;">,</span> MYSQL_OPT_RECONNECT<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>on<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;Error set mysql_options for MYSOL_OPT_RECONNECT:%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> mysql_error<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>OK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>mysql_real_connect<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;localhost&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;root&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;123456789&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Grandi_Power&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>NULL<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;Error connecting to database: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span>mysql_error<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>ERROR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span>OK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> my_insert<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> user_info <span style="color: #339933;">*</span> user<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
        MYSQL_STMT <span style="color: #339933;">*</span>stmt<span style="color: #339933;">;</span> 
        MYSQL_BIND  bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
        <span style="color: #993333;">int</span> user_name_len<span style="color: #339933;">,</span> user_pswd_len<span style="color: #339933;">;</span> 
&nbsp;
        my_ulonglong  affected_rows<span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>sql<span style="color: #339933;">=</span><span style="color: #ff0000;">&quot;insert into user (USERNAME,PASSWORD,ARK_GROUP_ID,PURVIWE_GROUP_ID,LEVEL) values(?,?,?,?,?)&quot;</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>stmt <span style="color: #339933;">=</span> mysql_stmt_init<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>my_sql<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
                <span style="color: #b1b100;">return</span><span style="color: #339933;">;</span> 
&nbsp;
        memset<span style="color: #009900;">&#40;</span>bind<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>bind<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>mysql_stmt_prepare<span style="color: #009900;">&#40;</span>stmt<span style="color: #339933;">,</span> sql<span style="color: #339933;">,</span> strlen<span style="color: #009900;">&#40;</span>sql<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                mysql_stmt_close<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span> ERROR<span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        user_name_len <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        user_pswd_len <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>pswd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_type</span> <span style="color: #339933;">=</span> MYSQL_TYPE_VAR_STRING<span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_length</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">25</span><span style="color: #339933;">;</span>                 <span style="color: #808080; font-style: italic;">/* 最大长度 */</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">is_null</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">length</span><span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>user_name_len<span style="color: #339933;">;</span>                   <span style="color: #808080; font-style: italic;">/* 实际长度的地址 */</span> 
&nbsp;
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_type</span> <span style="color: #339933;">=</span> MYSQL_TYPE_VAR_STRING<span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>pswd<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_length</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">25</span><span style="color: #339933;">;</span>                 <span style="color: #808080; font-style: italic;">/* 最大长度 */</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">is_null</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">length</span><span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>user_pswd_len<span style="color: #339933;">;</span>                   <span style="color: #808080; font-style: italic;">/* 实际长度的地址 */</span> 
&nbsp;
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_type</span> <span style="color: #339933;">=</span> MYSQL_TYPE_LONG<span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>ark_grp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">is_null</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">length</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
&nbsp;
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_type</span> <span style="color: #339933;">=</span> MYSQL_TYPE_LONG<span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>puv_grp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">is_null</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">length</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
&nbsp;
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer_type</span> <span style="color: #339933;">=</span> MYSQL_TYPE_LONG<span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">buffer</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span>user<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>level<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">is_null</span><span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
        bind<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span>.<span style="color: #202020;">length</span><span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mysql_stmt_bind_param<span style="color: #009900;">&#40;</span>stmt<span style="color: #339933;">,</span> bind<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                mysql_stmt_close<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span> ERROR<span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>mysql_stmt_execute<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                mysql_stmt_close<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span> ERROR<span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        affected_rows <span style="color: #339933;">=</span> mysql_stmt_affected_rows<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #339933;">!=</span>affected_rows<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                mysql_stmt_close<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
                <span style="color: #b1b100;">return</span> ERROR<span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span> 
&nbsp;
        <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;INSERT SUCCEESFUL<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        mysql_stmt_close<span style="color: #009900;">&#40;</span>stmt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">struct</span> user_info user<span style="color: #339933;">;</span> 
        strcpy<span style="color: #009900;">&#40;</span>user.<span style="color: #202020;">name</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;haha&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        strcpy<span style="color: #009900;">&#40;</span>user.<span style="color: #202020;">pswd</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;ninini&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        user.<span style="color: #202020;">level</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">;</span> 
        user.<span style="color: #202020;">ark_grp</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">88822</span><span style="color: #339933;">;</span> 
        user.<span style="color: #202020;">puv_grp</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">333</span><span style="color: #339933;">;</span> 
&nbsp;
        init_datebase<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        my_insert<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>user<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
        <span style="color: #b1b100;">return</span> OK<span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</div>
<div> </div>
</div>
<div>
<div>Makefile:</div>
<div>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="makefile" style="font-family:monospace;">mytest: mysqltest.c  mysqltest.h
        gcc -o mytest mysqltest.c -I/usr/include/mysql -L/usr/lib/mysql  -lmysqlclient</pre></td></tr></table></div>

</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/mysql-c-api%e4%b8%8a/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编码之外</title>
		<link>http://cyher.net/programming/coding_outside</link>
		<comments>http://cyher.net/programming/coding_outside#comments</comments>
		<pubDate>Wed, 14 Jan 2009 11:38:01 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[coder]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[软件工程]]></category>

		<guid isPermaLink="false">http://cyher.net/?p=636843</guid>
		<description><![CDATA[        中国的程序员的问题,ok.也许我没有资格评论,我也是一个中国的程序员,而且是很不合格的一个.广义的程序员分三种:1.coder,2.programmer,3,architect.也就是,代码输入员,程序编写员,系统架构师.现在很清楚我想说什么了,咱们大部分人还是coder,我们要变成programmer甚至architect!但是我自己也不知道怎么变成&#8230;.不过我是用c语言以及脚本语言,汇编语言的就很少牵扯architect的问题了.        按照一个面向对象程序员的发展来说,coder-&#62;programmer-&#62;architect基本都是这样的发展了,但是毕竟还有其他的一些情况了.对于底层的呢coder-&#62;programmer-&#62;hacker or cracker.说多了,仅仅是我的观点.我写这些一定是事出有因的.今天在公司正在准备明年的项目,在做需求分析和概要设计的时候,我们几个讨论没有什么结果,就请来了一个作了十几年java的一个”老”程序员.他的到来,让我一个底层的程序员感觉到软件工程这几个字(我对软工一窍不通),分析问题井井有条,叙述解决问题的方法是清晰简洁.在公司的白板上画了一幅又一幅烂熟于心的结构,让整个讨论顺利的进行,并且达到了一个新的高度.        在我心中他就是一个architect(确实也是),他整个讨论中很少触及代码实现,但是他的话让我觉得代码是确实整个系统的很小的一部分,尽管在实际上程序就是代码构成.真正让我感觉我现在只是个coder就是他说的:”文档的重要性”.在讨论即将结束的时候,他要求做java的那个程序员把今天讨论的结果整理一下,再用文裆把整个系统的基本结构描述一下,为我们下次的讨论做好准备.但是那个程序员愁眉苦脸,说我这两天我写文档都快写吐了,(实际上他写了8页的word),老java程序员也就是architcet告诉他: 年轻人,你知道对于一个优秀的系统,编码之外的事要比你认为的编码重要的多!没有优秀的文档支持,随之而来的就是,无尽的bug,甚至是架构上的设计失误,返工是不可避免的.编码的时间最多也就是20%的时间,更长的时间我们就是在写文档!这个写文档就是,我们现在做的需求分析,概要设计,详细设计! 然后,他就举出了几个例子,拿出了一个概要设计,在我看来那份概要设计,对我来说比详细设计还要详细,但是那只是他所谓的概要设计.他给我们讲完了以后,用ROSE给我们演示文档生成代码,这个虽然我造就知道,但是第一次看,真的很疯狂!真的让我明白在面向对象程序里面,编码之外的架构师为什么有那么高的身价,而我们这些coder为什么被称为IT民工了.当然我是做底层的,我的不会去管java的事,但是由这段谈话,我真正理解了编码之外的事情!大家想想看,在我们编程的时候,是否为我们快速完成了一项功能而欣喜,但我们欣喜的代价就是处理bug的痛苦.真心希望中国和我一样的初级coder们能够完善自己的文档,完善自己的思想.程序是衣,算法是魂,那么架构就是(我还没想好)&#8230;]]></description>
			<content:encoded><![CDATA[<p>        中国的程序员的问题,ok.也许我没有资格评论,我也是一个中国的程序员,而且是很不合格的一个.广义的程序员分三种:1.coder,2.programmer,3,architect.也就是,代码输入员,程序编写员,系统架构师.现在很清楚我想说什么了,咱们大部分人还是coder,我们要变成programmer甚至architect!但是我自己也不知道怎么变成&#8230;.不过我是用c语言以及脚本语言,汇编语言的就很少牵扯architect的问题了.</p>
<p>       按照一个面向对象程序员的发展来说,coder-&gt;programmer-&gt;architect基本都是这样的发展了,但是毕竟还有其他的一些情况了.对于底层的呢coder-&gt;programmer-&gt;hacker or cracker.说多了,仅仅是我的观点.我写这些一定是事出有因的.今天在公司正在准备明年的项目,在做需求分析和概要设计的时候,我们几个讨论没有什么结果,就请来了一个作了十几年java的一个”老”程序员.他的到来,让我一个底层的程序员感觉到软件工程这几个字(我对软工一窍不通),分析问题井井有条,叙述解决问题的方法是清晰简洁.在公司的白板上画了一幅又一幅烂熟于心的结构,让整个讨论顺利的进行,并且达到了一个新的高度.</p>
<p>       在我心中他就是一个architect(确实也是),他整个讨论中很少触及代码实现,但是他的话让我觉得代码是确实整个系统的很小的一部分,尽管在实际上程序就是代码构成.真正让我感觉我现在只是个coder就是他说的:”文档的重要性”.在讨论即将结束的时候,他要求做java的那个程序员把今天讨论的结果整理一下,再用文裆把整个系统的基本结构描述一下,为我们下次的讨论做好准备.但是那个程序员愁眉苦脸,说我这两天我写文档都快写吐了,(实际上他写了8页的word),老java程序员也就是architcet告诉他:</p>
<blockquote><p>年轻人,你知道对于一个优秀的系统,编码之外的事要比你认为的编码重要的多!没有优秀的文档支持,随之而来的就是,无尽的bug,甚至是架构上的设计失误,返工是不可避免的.编码的时间最多也就是20%的时间,更长的时间我们就是在写文档!这个写文档就是,我们现在做的需求分析,概要设计,详细设计!</p></blockquote>
<p>然后,他就举出了几个例子,拿出了一个概要设计,在我看来那份概要设计,对我来说比详细设计还要详细,但是那只是他所谓的概要设计.他给我们讲完了以后,用ROSE给我们演示文档生成代码,这个虽然我造就知道,但是第一次看,真的很疯狂!真的让我明白在面向对象程序里面,编码之外的架构师为什么有那么高的身价,而我们这些coder为什么被称为IT民工了.当然我是做底层的,我的不会去管java的事,但是由这段谈话,我真正理解了编码之外的事情!大家想想看,在我们编程的时候,是否为我们快速完成了一项功能而欣喜,但我们欣喜的代价就是处理bug的痛苦.真心希望中国和我一样的初级coder们能够完善自己的文档,完善自己的思想.程序是衣,算法是魂,那么架构就是(我还没想好)&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/coding_outside/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>linux环境编程之进程间通信（消息队列)</title>
		<link>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97</link>
		<comments>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97#comments</comments>
		<pubDate>Thu, 07 Aug 2008 00:28:07 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[GNU/linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://cyher.yo2.cn/articles/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97.html</guid>
		<description><![CDATA[/************************************************************** * name : server.c                          * * author : cyher                          * * date : 2008-8-6                          * * description : 服务端进程向消息队列里面放消息传给客户端     * **************************************************************/ #include &#60;sys/types.h&#62; #include &#60;stdio.h&#62; #include &#60;stdlib.h&#62; #include &#60;sys/ipc.h&#62; #include &#60;sys/msg.h&#62; #include &#60;string.h&#62; #include &#60;time.h&#62; struct msgbuf/*消息队列结构*/ { long [...]]]></description>
			<content:encoded><![CDATA[<p>/**************************************************************<br />
* name : server.c                                *<br />
* author : cyher                                *<br />
* date : 2008-8-6                                *<br />
* description : 服务端进程向消息队列里面放消息传给客户端      *<br />
**************************************************************/<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;sys/ipc.h&gt;<br />
#include &lt;sys/msg.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;time.h&gt;</p>
<p>struct msgbuf/*消息队列结构*/<br />
{<br />
long mtype;<br />
char mtext[256];<br />
};</p>
<p>int<br />
init_daemon(void);/*守护进程启动函数*/</p>
<p>int<br />
main()<br />
{<br />
key_t key;<br />
int msgid;<br />
char *p;<br />
time_t t;<br />
struct msgbuf msg= {100,”"};/*设置消息的id为100*/<br />
key = ftok(“/home/cyher/workspace/c/star”,&#8217;s');/*产生一个key*/<br />
msgid = msgget(key,IPC_CREAT | 0666);/*产生一个ipc标识*/<br />
if(msgid == -1)<br />
{<br />
perror(“msgget”);<br />
exit(1);<br />
}</p>
<p>init_daemon();/*守护进程创建*/<br />
while(1)/*进入循环执行*/<br />
{<br />
t = time(NULL);<br />
p = asctime(localtime(&amp;t));<br />
strcpy(msg.mtext,p);/*把时间字符放入msg.mtext*/<br />
msgsnd(msgid,&amp;msg,strlen(msg.mtext)+1,IPC_NOWAIT);/*放入消息队列无阻塞*/<br />
sleep(2);<br />
}</p>
<p>}</p>
<p>/**************************************************************<br />
* name : client.c                                *<br />
* author : cyher                                *<br />
* date : 2008-8-6                                *<br />
* description : 客户端进程从消息队列里面取消息打印到屏幕上    *<br />
**************************************************************/<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;sys/ipc.h&gt;<br />
#include &lt;sys/msg.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;time.h&gt;</p>
<p>struct msgbuf<br />
{<br />
long mtype;<br />
char mtext[256];<br />
};</p>
<p>int<br />
main()<br />
{<br />
key_t key;<br />
int msgid;<br />
struct msgbuf msg;<br />
key = ftok(“/home/cyher/workspace/c/star”,&#8217;s');<br />
msgid = msgget(key,IPC_CREAT | 0666);<br />
if(msgid == -1)<br />
{<br />
perror(“msgget”);<br />
exit(1);<br />
}</p>
<p>while(1)<br />
{<br />
if(msgrcv(msgid,&amp;msg,256,100,IPC_NOWAIT) == -1)<br />
{<br />
perror(“msgrcv:”);<br />
}<br />
printf(“%s”,msg.mtext);<br />
memset(&amp;msg,0,sizeof(struct msgbuf));<br />
sleep(2);<br />
}</p>
<p>}</p>
<p>/*******************************<br />
* name:init_daemon.c<br />
* author:cyher<br />
* date:2008-8-1<br />
* description:initialize a daemon process<br />
* */</p>
<p>#include &lt;unistd.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;sys/stat.h&gt;<br />
#include &lt;stdlib.h&gt;</p>
<p>int<br />
init_daemon()<br />
{<br />
int pid;<br />
int i;<br />
if( (pid=fork())&lt;0 )<br />
{<br />
perror(“fork”);<br />
exit(1);<br />
}<br />
else if(pid &gt; 0) //是父进程就退出<br />
{<br />
exit(0);<br />
}</p>
<p>if((pid=fork()) &lt; 0)<br />
{<br />
perror(“fork2&#8243;);<br />
exit(1);<br />
}<br />
else if (pid &gt; 0)//是第一子进程也退出<br />
{<br />
exit(0);<br />
}<br />
//<br />
//下面都是第二子进程运行<br />
sleep(2);<br />
setsid();//使子进程脱离父进程的关系，把父进程的信息改掉<br />
//脱离终端的控制<br />
//<br />
for(i=0;i&lt;1024;i++)//关闭文件描述符,节省资源<br />
close(i);<br />
chdir(“/tmp”);//改变工作目录<br />
umask(0);//重设掩码，使程序工作顺畅</p>
<p>return 0;</p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e6%b6%88%e6%81%af%e9%98%9f%e5%88%97/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux环境编程进程间通信(共享内存)</title>
		<link>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%ef%bc%89</link>
		<comments>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%ef%bc%89#comments</comments>
		<pubDate>Thu, 07 Aug 2008 00:23:52 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://cyher.yo2.cn/articles/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%ef%bc%89.html</guid>
		<description><![CDATA[/***************************************** * name : shm_a.c * author : cyher * date : 2008-8-6 * description : 进程a，共享内存通信 *****************************************/ #include &#60;sys/ipc.h&#62; #include &#60;sys/shm.h&#62; #include &#60;sys/types.h&#62; #include &#60;stdio.h&#62; #include &#60;stdlib.h&#62; #include &#60;string.h&#62; #include &#60;time.h&#62; #include &#60;unistd.h&#62; int main() { int oflag,id; char *ptr; char buf[512]; size_t length=512; time_t t; oflag = 0644&#124;IPC_CREAT; id = shmget(ftok(“/home/cyher/workspace/c/star”,89),length,oflag); if((ptr = [...]]]></description>
			<content:encoded><![CDATA[<p>/*****************************************<br />
* name : shm_a.c<br />
* author : cyher<br />
* date : 2008-8-6<br />
* description : 进程a，共享内存通信<br />
*****************************************/<br />
#include &lt;sys/ipc.h&gt;<br />
#include &lt;sys/shm.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;time.h&gt;<br />
#include &lt;unistd.h&gt;</p>
<p>int<br />
main()<br />
{<br />
int oflag,id;<br />
char *ptr;<br />
char buf[512];<br />
size_t length=512;<br />
time_t t;</p>
<p>oflag = 0644|IPC_CREAT;<br />
id = shmget(ftok(“/home/cyher/workspace/c/star”,89),length,oflag);<br />
if((ptr = shmat(id,NULL,0)) == (void *) -1)<br />
{<br />
perror(“shmat”);<br />
exit(1);</p>
<p>}<br />
while(1)<br />
{<br />
t=time(NULL);<br />
memset(buf,0,512);<br />
memcpy(buf,ptr,512);<br />
printf(“%s”,buf);<br />
sprintf(ptr,”time: %s  pid: [%d]\n”,asctime(localtime(&amp;t)),getpid());<br />
sleep(5);<br />
}<br />
}</p>
<p>/*****************************************<br />
* name : shm_b.c<br />
* author : cyher<br />
* date : 2008-8-6<br />
* description : 进程b，共享内存通信<br />
*****************************************/</p>
<p>#include &lt;sys/ipc.h&gt;<br />
#include &lt;sys/shm.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;time.h&gt;<br />
#include &lt;unistd.h&gt;</p>
<p>int<br />
main()<br />
{<br />
int oflag,id;<br />
char *ptr;<br />
char buf[512];<br />
size_t length=512;<br />
time_t t;</p>
<p>oflag = 0644|IPC_CREAT;<br />
id = shmget(ftok(“/home/cyher/workspace/c/star”,89),length,oflag);<br />
if((ptr = shmat(id,NULL,0)) == (void *) -1)<br />
{<br />
perror(“shmat”);<br />
exit(1);</p>
<p>}<br />
while(1)<br />
{<br />
sleep(5);<br />
t=time(NULL);<br />
memset(buf,0,512);<br />
memcpy(buf,ptr,512);<br />
printf(“%s”,buf);<br />
sprintf(ptr,”time: %s  pid: [%d]\n”,asctime(localtime(&amp;t)),getpid());<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88%e5%85%b1%e4%ba%ab%e5%86%85%e5%ad%98%ef%bc%89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux环境编程之进程间通信（pipe &amp; FIFO）</title>
		<link>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88pipe-fifo%ef%bc%89</link>
		<comments>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88pipe-fifo%ef%bc%89#comments</comments>
		<pubDate>Wed, 06 Aug 2008 01:21:33 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[GNU/linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://cyher.yo2.cn/articles/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88pipe-fifo%ef%bc%89.html</guid>
		<description><![CDATA[/***********************rw.h*******************/ #include &#60;unistd.h&#62; int Read(int fd, void *buf,size_t count) { void *p =buf; int totle = count; int current = 0; int iRet = 0; while(current &#60; totle) { iRet = read(fd,p + current,totle &#8211; current); if(iRet &#60; 0) { perror(“Read Error”); return -1; } else if(iRet == 0) { return current; } else { [...]]]></description>
			<content:encoded><![CDATA[<p>/***********************rw.h*******************/<br />
#include &lt;unistd.h&gt;</p>
<p>int  Read(int fd, void *buf,size_t count)<br />
{<br />
void *p =buf;<br />
int totle = count;<br />
int current = 0;<br />
int iRet = 0;</p>
<p>while(current &lt; totle)<br />
{<br />
iRet = read(fd,p +  current,totle &#8211; current);<br />
if(iRet &lt; 0)<br />
{<br />
perror(“Read Error”);<br />
return -1;<br />
}<br />
else if(iRet == 0)<br />
{<br />
return current;</p>
<p>}<br />
else<br />
{<br />
current += iRet;<br />
}<br />
}<br />
return current;</p>
<p>}</p>
<p>int Write(int fd,void *buf,size_t count)</p>
<p>{<br />
void *p = buf;<br />
int totle = count;<br />
int current = 0;<br />
int iRet = 0;</p>
<p>while(current &lt; totle)<br />
{<br />
iRet = write(fd,p + current,totle &#8211; current);<br />
if(iRet &lt; 0)<br />
{<br />
perror(“Write Error”);<br />
return -1;<br />
}<br />
else if(iRet == 0)<br />
{<br />
return current;<br />
}<br />
else<br />
{<br />
current += iRet;<br />
}<br />
}<br />
return current;<br />
}</p>
<p>/********************************************************<br />
* name : pipe_print.c<br />
* author : cyher<br />
* date :2008-8-5<br />
* descirption : 两个进程，父进程和子进程。<br />
*                建立pipe父进程读取文件名给子进程读文件给父进程。<br />
*                父进程打印在屏幕上。<br />
* ********************************************************/</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;unistd.h&gt;<br />
#include &lt;sys/wait.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;sys/stat.h&gt;<br />
#include &lt;fcntl.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;string.h&gt;<br />
#include “rw.h”//读管道的时候需要用这个自己写的read循环读，否则一次可能读不全<br />
#define MAX 1024<br />
int main (int argc,char *argv[])<br />
{<br />
int fd1[2];<br />
int fd2[2];<br />
int pipe1,pipe2;<br />
size_t n=1;<br />
pid_t pid;<br />
char buf1[MAX] = {0};<br />
char buf2[MAX] = {0};<br />
char buf3[MAX] = {0};<br />
int fd;<br />
ssize_t read_num;<br />
if(argc != 2)<br />
{<br />
printf(“usage:\”pipe_print name\n\”");<br />
exit(0);<br />
}<br />
if((pipe1=pipe(fd1)) == -1 )//父向子传信息的管道<br />
{<br />
perror(“pipe1&#8243;);<br />
exit(1);<br />
}</p>
<p>if((pipe2=pipe(fd2)) == -1)//子向父传信息的管道<br />
{<br />
perror(“pipe2&#8243;);<br />
exit(1);<br />
}</p>
<p>if((pid=fork()) &lt; 0)<br />
{<br />
perror(“fork”);<br />
exit(1);<br />
}<br />
else if(pid == 0)//子进程<br />
{<br />
close(fd1[1]);/*关管道1写端*/<br />
close(fd2[0]);/*关管道2读端*/<br />
sleep(1);<br />
if(read(fd1[0],buf2,MAX) == -1)/*读取父进程传来的文件名*/<br />
{<br />
exit(1);<br />
}<br />
if(( fd = open(buf2,O_RDONLY,0) ) &lt; 0)/*打开文件*/<br />
{<br />
perror(“open error”);<br />
exit(1);<br />
}</p>
<p>while(Read(fd,buf1,MAX) &gt; 0)/*读文件放入buf1*/<br />
{<br />
Write(fd2[1],buf1,MAX);/*写入管道2*/<br />
memset(buf1,0,MAX);/*清空buf1以免出错*/<br />
}<br />
close(fd1[0]);<br />
close(fd2[1]);<br />
exit(0);<br />
}<br />
else//父进程<br />
{</p>
<p>close(fd2[1]);/*关管道2的写端*/<br />
close(fd1[0]);/*关管道1的读端*/<br />
n=strlen(argv[1]);<br />
if(Write(fd1[1],argv[1],n) == -1)/*把命令行参数发给管道1*/<br />
{<br />
exit(1);<br />
}<br />
while((read_num=Read(fd2[0],buf3,MAX)) &gt; 0 )/*读取管道2中的信息放在buf3中*/<br />
{<br />
if(read_num == -1)<br />
{<br />
perror(“read”);<br />
exit(1);<br />
}</p>
<p>if(Write(1,buf3,MAX) &lt; 0)/*把buf3中的信息写在表准输出上*/<br />
{<br />
perror(“write”);<br />
exit(1);<br />
}<br />
memset(buf3,0,MAX);/*清空buf3以免出错*/<br />
}<br />
putchar(&#8216;\n&#8217;);<br />
close(fd1[1]);<br />
close(fd2[0]);<br />
if(waitpid(pid,NULL,0) == -1)/*父进程等待子进程关闭回收子进程资源*/<br />
{<br />
perror(“wait”);<br />
exit(1);<br />
}<br />
}<br />
}</p>
<p>/********************************************************<br />
* name : fifo.c<br />
* author : cyher<br />
* date :2008-8-5<br />
* descirption : 两个进程，父进程和子进程<br />
*                建立FIFO父进程读取文件名传给子进程读取文件传回父进程<br />
*                父进程再打印在屏幕上<br />
* ********************************************************/</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;unistd.h&gt;<br />
#include &lt;sys/wait.h&gt;<br />
#include &lt;sys/types.h&gt;<br />
#include &lt;sys/stat.h&gt;<br />
#include &lt;fcntl.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;string.h&gt;<br />
#include “rw.h”<br />
#define MAX 1024<br />
int main (int argc,char *argv[])<br />
{<br />
int fd1,fd2,fd3,fd4;<br />
int fifo,fifo2;<br />
size_t n=1;<br />
pid_t pid;<br />
char buf1[MAX] = {0};<br />
char buf2[MAX] = {0};<br />
char buf3[MAX] = {0};<br />
int fd;<br />
ssize_t read_num;<br />
if(argc != 2)<br />
{<br />
printf(“usage:\”pipe_print name\n\”");<br />
exit(0);<br />
}<br />
if((fifo=mkfifo(“/tmp/cyher088&#8243;,0777)) == -1)<br />
{<br />
perror(“fifo”);<br />
exit(1);</p>
<p>}<br />
if((fifo2=mkfifo(“/tmp/cyher089&#8243;,0777)) == -1)<br />
{<br />
perror(“fifo”);<br />
exit(1);</p>
<p>}<br />
if((pid=fork()) &lt; 0)<br />
{<br />
perror(“fork”);<br />
exit(1);<br />
}<br />
else if(pid == 0)//子进程<br />
{<br />
if( ( fd1 = open(“/tmp/cyher088&#8243;,O_RDONLY,0666) ) == -1)<br />
{<br />
perror(“open1&#8243;);<br />
exit(1);<br />
}<br />
sleep(1);<br />
if(read(fd1,buf2,MAX) == -1)<br />
{<br />
perror(“read”);<br />
exit(1);<br />
}<br />
if(( fd = open(buf2,O_RDONLY,0) ) &lt; 0)<br />
{<br />
perror(“open error”);<br />
exit(1);<br />
}<br />
if( ( fd4 = open(“/tmp/cyher089&#8243;,O_WRONLY ,0666) ) == -1)<br />
{<br />
perror(“open1&#8243;);<br />
exit(1);<br />
}</p>
<p>while(Read(fd,buf1,MAX) &gt; 0)<br />
{<br />
Write(fd4,buf1,MAX);<br />
memset(buf1,0,MAX);<br />
}<br />
close(fd1);<br />
close(fd4);<br />
exit(0);<br />
}<br />
else//父进程<br />
{</p>
<p>if( ( fd3 = open(“/tmp/cyher088&#8243;,O_WRONLY ,0666) ) == -1)<br />
{<br />
perror(“open1&#8243;);<br />
exit(1);<br />
}<br />
n=strlen(argv[1]);<br />
if(Write(fd3,argv[1],n) == -1)<br />
{<br />
exit(1);<br />
}<br />
if( ( fd2 = open(“/tmp/cyher089&#8243;,O_RDONLY,0666) ) == -1)<br />
{<br />
perror(“open1&#8243;);<br />
exit(1);<br />
}<br />
while((read_num=Read(fd2,buf3,MAX)) &gt; 0 )<br />
{<br />
if(read_num == -1)<br />
{<br />
perror(“read”);<br />
exit(1);<br />
}</p>
<p>if(Write(1,buf3,MAX) &lt; 0)<br />
{<br />
perror(“write”);<br />
exit(1);<br />
}<br />
memset(buf3,0,MAX);<br />
}<br />
putchar(&#8216;\n&#8217;);<br />
close(fd3);<br />
close(fd2);<br />
if(waitpid(pid,NULL,0) == -1)<br />
{<br />
perror(“wait”);<br />
exit(1);<br />
}<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%bf%9b%e7%a8%8b%e9%97%b4%e9%80%9a%e4%bf%a1%ef%bc%88pipe-fifo%ef%bc%89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux环境编程之文件操作（标准I/O）</title>
		<link>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c%ef%bc%88%e6%a0%87%e5%87%86io%ef%bc%89</link>
		<comments>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c%ef%bc%88%e6%a0%87%e5%87%86io%ef%bc%89#comments</comments>
		<pubDate>Tue, 05 Aug 2008 00:51:34 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[GNU/linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://cyher.yo2.cn/articles/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c%ef%bc%88%e6%a0%87%e5%87%86io%ef%bc%89.html</guid>
		<description><![CDATA[在linux下面一切皆文件这个概念因该深入linux 程序员或者将要成为linux 程序员的人心中。所以在linux下面对文件的操作是很重要的，下面是我做的一个例程用的是标准 I/O 对配置文件的改写是写linux程序很重要的一点，但是改写一个文件的时候，我们没有办法像用vi或者word那样直接插入就行了，因为，就算是word 或者vi他们都是把文件copy出来一个副本，然后你该然后再改名放回去，这基本上就是我理解的原理，所以代码也体现了这个原理，用标准I/O来做 /***********************************************/ /* name:changeini.c * author:cyher * date :2008-7-25 * description:change a line in ss.ini * */ #include #include #include #define MAX 100 int main(int argc,char *argv[]) { char ch[MAX]={0}; char insert[]=”cgihome”; char *p=ch; FILE *fp1 = fopen(“ss.ini”,”r”);//直读打开ss.ini if(fp1 == NULL) { printf(“er1&#8243;); exit(1); } FILE *fp2 = fopen(“ss.ini.bak”,”wa+”);//截断打开ss.ini.bak if(fp2 [...]]]></description>
			<content:encoded><![CDATA[<p id="blog_text" class="cnt">在linux下面一切皆文件这个概念因该深入linux 程序员或者将要成为linux 程序员的人心中。所以在linux下面对文件的操作是很重要的，下面是我做的一个例程用的是标准 I/O<br />
对配置文件的改写是写linux程序很重要的一点，但是改写一个文件的时候，我们没有办法像用vi或者word那样直接插入就行了，因为，就算是word 或者vi他们都是把文件copy出来一个副本，然后你该然后再改名放回去，这基本上就是我理解的原理，所以代码也体现了这个原理，用标准I/O来做</p>
<p>/***********************************************/</p>
<p>/* name:changeini.c<br />
* author:cyher<br />
* date :2008-7-25<br />
* description:change a line in ss.ini<br />
* */<br />
#include<br />
#include<br />
#include<br />
#define MAX 100<br />
int main(int argc,char *argv[])<br />
{<br />
char ch[MAX]={0};<br />
char insert[]=”cgihome”;<br />
char *p=ch;<br />
FILE *fp1 = fopen(“ss.ini”,”r”);//直读打开ss.ini<br />
if(fp1 == NULL)<br />
{<br />
printf(“er1&#8243;);<br />
exit(1);<br />
}<br />
FILE *fp2 = fopen(“ss.ini.bak”,”wa+”);//截断打开ss.ini.bak<br />
if(fp2 == NULL)<br />
{<br />
printf(“er2&#8243;);<br />
exit(1);<br />
}<br />
/*<br />
*从ss.ini中一行一行读数据判断是否是要插入的行的上一行<br />
*/<br />
while(fgets(p,MAX,fp1))<br />
{<br />
fputs(p,fp2);<br />
fflush(NULL);<br />
ch[7]=&#8217;\0&#8242;; //截断字符串，取前7个字符作为字符串<br />
if(!strcmp(p,insert))//如果要找的字符串出现<br />
{<br />
fputs(“name = serverName\n”,fp2);//插入这句<br />
}<br />
}<br />
fclose(fp1);<br />
fclose(fp2);//关闭文件指针<br />
/*这里应该有一个把ss.ini删去，把ss.ini.bak改名为ss.ini的功能*/<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/linux%e7%8e%af%e5%a2%83%e7%bc%96%e7%a8%8b%e4%b9%8b%e6%96%87%e4%bb%b6%e6%93%8d%e4%bd%9c%ef%bc%88%e6%a0%87%e5%87%86io%ef%bc%89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>重新拾起c# 写点小东西玩玩，“浏览记录清理&amp;启动项管理”</title>
		<link>http://cyher.net/programming/%e9%87%8d%e6%96%b0%e6%8b%be%e8%b5%b7c-%e5%86%99%e7%82%b9%e5%b0%8f%e4%b8%9c%e8%a5%bf%e7%8e%a9%e7%8e%a9%ef%bc%8c%e2%80%9c%e6%b5%8f%e8%a7%88%e8%ae%b0%e5%bd%95%e6%b8%85%e7%90%86%e5%90%af%e5%8a%a8</link>
		<comments>http://cyher.net/programming/%e9%87%8d%e6%96%b0%e6%8b%be%e8%b5%b7c-%e5%86%99%e7%82%b9%e5%b0%8f%e4%b8%9c%e8%a5%bf%e7%8e%a9%e7%8e%a9%ef%bc%8c%e2%80%9c%e6%b5%8f%e8%a7%88%e8%ae%b0%e5%bd%95%e6%b8%85%e7%90%86%e5%90%af%e5%8a%a8#comments</comments>
		<pubDate>Fri, 16 Nov 2007 13:28:07 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://cyher.yo2.cn/articles/%e9%87%8d%e6%96%b0%e6%8b%be%e8%b5%b7c-%e5%86%99%e7%82%b9%e5%b0%8f%e4%b8%9c%e8%a5%bf%e7%8e%a9%e7%8e%a9%ef%bc%8c%e2%80%9c%e6%b5%8f%e8%a7%88%e8%ae%b0%e5%bd%95%e6%b8%85%e7%90%86%e5%90%af%e5%8a%a8.html</guid>
		<description><![CDATA[信息安全实验课题              ——上网痕迹清除 1．实验目的及要求：    上网痕迹自动清除、显示系统自启动项并能实现清除。 说明：实现一个软件，类似优化大师的部分功能，首先要列举出上网的过程中都会在系统中留下哪些痕迹，系统都包含哪些自启动项，然后能对指定的上网痕迹和指定的自启动项进行清除。 2. 实验环境：    开发平台：WindowsXP sp2 中文版，framework2.0 开发工具：visual studio 2005.NET 开发语言：c# 3. 实验内容：    1.上网浏览痕迹的类型： 上网历史 C:\Documents and Settings\ Username \Local Settings\History 上网保存在系统缓存中的网页 C:\Documents and Settings\cyher\Local Settings\Temporary Internet Files Ie自动保存的密码 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2 Ie6是HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\spw Ie自动完成的表单资料 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage1 Windows的临时文件夹 C:\Documents and Settings\Username\Local Settings\Temp C:\WINDOWS\Temp 开始菜单中的文档记录 C:\Documents and Settings\Username\Recent 上网产生的cookies   C:\Documents [...]]]></description>
			<content:encoded><![CDATA[<p><font size="3"><span><span>信息安全实验课题</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>              ——上网痕迹清除</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>1．实验目的及要求：</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>    上网痕迹自动清除、显示系统自启动项并能实现清除。 </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>说明：实现一个软件，类似优化大师的部分功能，首先要列举出上网的过程中都会在系统中留下哪些痕迹，系统都包含哪些自启动项，然后能对指定的上网痕迹和指定的自启动项进行清除。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>2. 实验环境：</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>    开发平台：WindowsXP sp2 中文版，framework2.0</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>开发工具：visual studio 2005.NET</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>开发语言：c#</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>3. 实验内容：</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>    1.上网浏览痕迹的类型：</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>上网历史 </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\Documents and Settings\ Username \Local Settings\History</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>上网保存在系统缓存中的网页</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\Documents and Settings\cyher\Local Settings\Temporary Internet Files</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>Ie自动保存的密码</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>Ie6是HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\spw</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>Ie自动完成的表单资料</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage1</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>Windows的临时文件夹</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\Documents and Settings\Username\Local Settings\Temp</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\WINDOWS\Temp</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>开始菜单中的文档记录</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\Documents and Settings\Username\Recent</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>上网产生的cookies  </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>C:\Documents and Settings\Username\Cookies</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>Ie地址栏下拉菜单</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>上 面的内容从原理上分，其中上网历史记录，上网保存在系统缓存中的网页，Windows的临时文件夹，开始菜单中的文档记录，上网产生的cookies这几 项都是缓存在Windows的特别文件夹中的。而Ie自动保存的密码，Ie地址栏下拉菜单，Ie自动完成的表单资料是在注册表中存放。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>基本原理就是删除不想要的文件和注册表项就可以了。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>所以，用c#编写的时候基本上就是两个类 一个DeleteFolder删除文件夹和文件，一个 DeleteKey删除注册表项。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>  public void DeleteFolder(string dir)</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>         {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             try</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 if (Directory.Exists(dir))    //如果存在这个文件夹删除之   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     foreach (string d in Directory.GetFileSystemEntries(dir))</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         string a = Path.GetExtension(d).ToString();</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         //if (d == dir+”<a href="file://%20%20index.dat/">\\index.dat</a>“)</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         if (a == “.dat”)</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                             continue;</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         else</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                             if (File.Exists(d))</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                                 File.Delete(d);     //直接删除其中的文件   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                             else</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                                 DeleteFolder(d);</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         }//递归删除子文件夹   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     // Directory.Delete(dir);     //删除已空文件夹   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                    //  Response.Write(dir+”  文件删除成功”);   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 else</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     MessageBox.Show(dir + ”  该文件夹不存在”);  //如果文件夹不存在则提示   </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             catch { }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>         }//删除文件夹类</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>private void DeleteKey(string keyName ,string keyUrl)//删除注册表值类</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>         {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             RegistryKey hklm = Registry.CurrentUser;</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             RegistryKey runs = hklm.OpenSubKey(keyUrl, true);</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             try</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 string[] runsName = runs.GetSubKeyNames();</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 foreach (string strName in runsName)</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 {</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                     if (strName.ToUpper() == keyName.ToUpper())</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                         runs.DeleteSubKey(strName);</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>                 }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>             catch { }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>         }</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>这两个类基本能实现要实现的两个功能。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>4.算法描述即实现步骤</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span> </span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>程序界面分两个部分</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>1.     上网浏览记录清除。</span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"><span><span>   </span></span></font></p>
<p><font size="3"><span><span></span></span></font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt">&nbsp;</p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">2.     启动项清除部分</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">基本由这两个部分构成，算法就是上面表示出来的两个类。其他的都是控件编程。</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">3.     在编程过程中遇到的困难。</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">1.     就是在删除浏览记录的时候，有个重要的index.dat文件删不掉，导致程序无法执行，于是就有这样的语句</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">                   if (a == “.dat”)</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">                        continue;</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">                         else</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">来跳过index.dat文件和其他删不了的.dat文件。等全部处理完以后在用算法处理index.dat文件。</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">2.     在写清除ie保存的密码的时候，发现了一个软件，能利用我要删除的着两个注册表项把密码还原出来</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">这两个注册表项分别为：</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">HKEY_CURRENT_USER\Software\Microsoft\Protected Storage System Provider\S-1-5-21-725345543-1788223648-839522115-1003\Data</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IntelliForms\Storage2</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">密码和帐号保存在下面的注册表项中，是加密过的，经过看这个软件的文档，密钥就应该在第一个注册表项中。至于怎么提取并解密，还需进一步研究。（详见<a href="http://www.nirsoft.net/">http://www.nirsoft.net/</a>）</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">5.项目小结</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3">    经过这次项目，了解了Windows的浏览记录保存机制，发现Windows的这种机制是很不安全的，很容易被黑客利用。做个这个软件能有效的从表面上，遏制一下不安全的操作，不过还是需要我们在使用电脑的时候有一个安全的意识。</font></p>
<p class="western" style="margin: 0cm 0cm 0pt 18pt"><font size="3"> </font></p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/programming/%e9%87%8d%e6%96%b0%e6%8b%be%e8%b5%b7c-%e5%86%99%e7%82%b9%e5%b0%8f%e4%b8%9c%e8%a5%bf%e7%8e%a9%e7%8e%a9%ef%bc%8c%e2%80%9c%e6%b5%8f%e8%a7%88%e8%ae%b0%e5%bd%95%e6%b8%85%e7%90%86%e5%90%af%e5%8a%a8/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>对于大学生嵌入式开发的认识</title>
		<link>http://cyher.net/hardware/%e5%af%b9%e4%ba%8e%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%b5%8c%e5%85%a5%e5%bc%8f%e5%bc%80%e5%8f%91%e7%9a%84%e8%ae%a4%e8%af%86</link>
		<comments>http://cyher.net/hardware/%e5%af%b9%e4%ba%8e%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%b5%8c%e5%85%a5%e5%bc%8f%e5%bc%80%e5%8f%91%e7%9a%84%e8%ae%a4%e8%af%86#comments</comments>
		<pubDate>Wed, 25 Apr 2007 06:49:16 +0000</pubDate>
		<dc:creator>cyher</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[嵌入式]]></category>

		<guid isPermaLink="false">http://www.cyher.net/articles/%e5%af%b9%e4%ba%8e%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%b5%8c%e5%85%a5%e5%bc%8f%e5%bc%80%e5%8f%91%e7%9a%84%e8%ae%a4%e8%af%86.html</guid>
		<description><![CDATA[这几天好累，但是我的心前所未有的清楚，知道我改做什么,不该做什么,呵呵,这样我就很满意了.这两天是我第一次自学的那么认真(在学c#),同时我还看了看symbian的东西.上form.nokia.com真是烦,自己的英语不好,还要看那么老长的技术性文档&#8230;.真是苦了我了.不过更让我知道英语的重要性,我要好好学英语,这是没的说的,这不星期天出去买了一本英文版的”操作系统-精髓与设计原理”,呵呵,同学说你要是吧这个看完了,你六级也就稳过了,哈哈.其实我也是这样想的,不过我能看完么. 我有那么多的学科要学,因为我的目标是嵌入式工程师或者3G网络工程师啊,这些都是交叉学科,要学的东西多着那&#8230;..电子电路,单片机,DSP,gsm蜂窝网络,通信原理,c,c++,c#.net,java-javaME,还有汇编,计算机组成原理,操作系统,linux,symbianOS,winCE,palmOS,linux的内核编译和裁减.这只是我想到的,我没想到的呢?我能完成这些东西么&#8230;我还来的急么?我现在都大3了,基本上什么都不会呢,也许会一点,但是和我现在要学的东西差的太远了,我以前弄过php和linux. 其实我自己没有什么把握的,但是我为什么在开始就说我的心前所未有的清楚呢?就是因为我能找到努力的对象了,不管成功与否,我都会尽力的.呵呵,只要我朝着我的梦想前进,我就是成功的! 不想想就业的事,太让人紧张了.呵呵,什么叫车道山前必有路啊?什么叫未雨绸缪啊? 各有个的见解吧..呵呵,我这样写日记貌似和blog的用途有点违背不过,我还是写了.慢慢的我会吧我的心得和体会都写上来的,呵呵,对于我这个计算机世界的”小朋友”,写点对大家有用的东西实在是比较难啊,不过我会努力的!]]></description>
			<content:encoded><![CDATA[<p>这几天好累，但是我的心前所未有的清楚，知道我改做什么,不该做什么,呵呵,这样我就很满意了.这两天是我第一次自学的那么认真(在学c#),同时我还看了看symbian的东西.上form.nokia.com真是烦,自己的英语不好,还要看那么老长的技术性文档&#8230;.真是苦了我了.不过更让我知道英语的重要性,我要好好学英语,这是没的说的,这不星期天出去买了一本英文版的”操作系统-精髓与设计原理”,呵呵,同学说你要是吧这个看完了,你六级也就稳过了,哈哈.其实我也是这样想的,不过我能看完么.<br />
我有那么多的学科要学,因为我的目标是嵌入式工程师或者3G网络工程师啊,这些都是交叉学科,要学的东西多着那&#8230;..电子电路,单片机,DSP,gsm蜂窝网络,通信原理,c,c++,c#.net,java-javaME,还有汇编,计算机组成原理,操作系统,<a href="http://cyher.net/tag/linux" class="st_tag internal_tag" rel="tag" title="标签 linux 下的日志">linux</a>,symbianOS,winCE,palmOS,linux的内核编译和裁减.这只是我想到的,我没想到的呢?我能完成这些东西么&#8230;我还来的急么?我现在都大3了,基本上什么都不会呢,也许会一点,但是和我现在要学的东西差的太远了,我以前弄过php和linux.<br />
其实我自己没有什么把握的,但是我为什么在开始就说我的心前所未有的清楚呢?就是因为我能找到努力的对象了,不管成功与否,我都会尽力的.呵呵,只要我朝着我的梦想前进,我就是成功的!<br />
不想想就业的事,太让人紧张了.呵呵,什么叫车道山前必有路啊?什么叫未雨绸缪啊? 各有个的见解吧..呵呵,我这样写日记貌似和blog的用途有点违背不过,我还是写了.慢慢的我会吧我的心得和体会都写上来的,呵呵,对于我这个计算机世界的”小朋友”,写点对大家有用的东西实在是比较难啊,不过我会努力的!</p>
]]></content:encoded>
			<wfw:commentRss>http://cyher.net/hardware/%e5%af%b9%e4%ba%8e%e5%a4%a7%e5%ad%a6%e7%94%9f%e5%b5%8c%e5%85%a5%e5%bc%8f%e5%bc%80%e5%8f%91%e7%9a%84%e8%ae%a4%e8%af%86/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

