作者: falcon 发表日期: 2007-04-05 21:50
复制链接
1. stop the mysql server
$ps -ef | grep mysqld
then kill one by one
OR
$killall -TERM mysqld
2. start the mysql server with the following command
$ /usr/bin/mysqld_safe --skip-grant-table &
3. change your password for root
mysql> use mysql;
mysql> update user set password=password("new password") where user="root";
mysql> flush privileges;
mysql> quit
4. restart the mysql server with normal mode
/etc/init.d/mysql restart
转自:
http://www.cndw.com/tech/data/2006050864444.asp
有改动
作者: falcon 发表日期: 2007-03-05 17:03
复制链接
备份
Quote: |
mysqldump -u user -p db tab1 tab2 > db.sql
|
恢复
Quote: |
mysql -u user -p db < db.sql
|
参考资料:
备份/恢复
http://hi.baidu.com/hecheng/blog/item/e0d5b31c2e24a88b87d6b643.html
作者: falcon 发表日期: 2007-04-18 11:00
复制链接
如果管理过数据库,你就会发现手工备份数据库是个非常糟糕的事情。如果能够按照一定的策略自动备份,可能会是个不错的选择。
就mysql
来说,我们可以通过copy数据库文件和mysqldump两种方式来实现备份,这里我们通过直接copy数据库文件来进行备份(这种方式在不同的
mysql版本之间备份和恢复可能会存在问题,需要注意,当然mysqldump也会出一些问题,但是没有前者严重)。
下面介绍具体的备份方法:
先写一个实现自动备份的脚本(建议引入一些参数,提高灵活性):
Code:
[Ctrl+A Select All]
*这里的备份策略是:保留两周内备份的数据,备份的数据库名字包含日期信息
然后把上面的脚本作为cron的任务
> su
> crontab -e
4 4 * * 1 /bin/backup.sh 2>/var/log/backup.log
*这里的备份策略是:每周的周一的4点4分备份一次
这个样子就实现了每周备份一次,并保留两周内备份的数据。
作者: falcon 发表日期: 2006-09-27 15:27
复制链接
前些天由于项目需要,自己整了一个比较全面的获取IP地址的函数:
可以获取本地的IP地址,也可以根据域名获取IP地址,感觉比较有用特此奉献上,呵呵。
下面是源代码
Code:
[Ctrl+A Select All]
下面是一个测试的代码
test_GetIp.c
Code:
[Ctrl+A Select All]
具体使用演示
引文:
$./test_GetIp xxxy.lzu.edu.cn --这里是根据域名转换为IP地址
domain name or ip address : xxxy.lzu.edu.cn
current ip address: 202.201.0.237
$ ./test_GetIp 219.246.79.7 --输入地址返回地址
domain name or ip address : 219.246.79.7
current ip address: 219.246.79.7
$ ./test_GetIp localhost --获取本地IP地址
domain name or ip address : localhost
current ip address: 219.246.79.4
作者: falcon 发表日期: 2006-08-22 09:21
复制链接
经过几天的调试和修改,比较稳定的匿名ftp站点扫描工具终于完成拉。
该扫描工具可以扫描指定IP段的ftp站点,大家可以把它改写来扫描其他的端口。甚至基于此结构写一个ftp搜索引擎的爬虫。过段时间,我再把爬虫的代码公布出来,暂时正在调试和修改中。
这些天弄得很累,呵呵,暂时只把源代码弄上来。有时间再做详细的解释。有问题在后面跟帖哦。
ftp扫描的核心代码:ffs.c
Code:
[Ctrl+A Select All]
自动扫描多个IP段的脚本: affs
Code:
[Ctrl+A Select All]
这个可以用来终止上面的扫描过程: kffs
Code:
[Ctrl+A Select All]
下面是兰大校园网内的IP段: ftpinfo.txt
Quote: |
202.201.0.0
202.201.15.255;210.26.48.0 210.26.63.255;219.246.32.0
219.246.95.255;219.246.176.0 219.246.191.255;222.23.48.0
222.23.63.255;202.38.127.176 202.38.127.191;202.38.126.224
202.38.126.255
|
注意,每个段之间用分号分开哦,因为在affs脚本里头用到了这个分割符号。
下面这个可以在扫描过后的日志里头提取出ip地址: logtoip
Code:
[Ctrl+A Select All]
具体使用演示:
只用 ffs
Quote: |
falcon@falcon:~/program/c/code/ftp/socket$ gcc -lpthread -o ffs ffs.c falcon@falcon:~/program/c/code/ftp/socket$ ./ffs 219.246.183.222 219.246.183.222 startIp = 219.246.183.222,3690379230 endIp = 219.246.183.222,3690379230 thread 0 create successed! currentIp = 3690379230 219.246.183.222 220 Microsoft FTP Service 331 Anonymous access allowed, send identity (e-mail name) as password. 230 Anonymous user logged in. 221 <can login: 219.246.183.222> Thread 0 down Finish!
|
用 affs
Quote: |
falcon@falcon:~/program/c/code/ftp/socket$ ./affs ftpinfo.txt fs.log start time:2006年 08月 21日 星期一 21:38:01 CST is scaning...
|
正在扫描,结束以后,我们可以获得扫描的一个日志文件fs.log
用logtofile脚本提取可以访问的ip地址
Quote: |
falcon@falcon:~/program/c/code/ftp/socket$ ./logtoip fs.log 202.201.0.237 202.201.0.243 202.201.1.126 202.201.3.82 202.201.3.99 202.201.6.125 202.201.7.17 202.201.8.125 202.201.13.65 202.201.13.118 202.201.13.139 202.201.13.149
|
最好,要是想结束扫描的话,用 kffs脚本
Quote: |
falcon@falcon:~/program/c/code/ftp/socket$ ./kffs do you want to kill all ftp scan process?(y or n): y 杀死
|
另外,要是你想把你的测试结果发布,可以在日志里头提取出ip地址并放到html文件里头。下面是这么一个脚本:logtohtml
Code:
[Ctrl+A Select All]
为了让系统自动扫描所有的IP段,并保存为html文件发布出去,那么我们可以这么做。再写个脚本 updateftp,(把affs 和logtohtml放在同一目录下哦,还有updateftp也是)
Code:
[Ctrl+A Select All]
如果再加上crontab,我们就可以让系统自动扫描拉
Quote: |
$crontab -e 00 12 * * * path/to/updateftp
|
ok,好啦
这里是演示的最终结果:
http://mirror.lzu.edu.cn/newftp/index.html
经过测试,扫描整个兰大校园网内的IP段,大概需要15钟左右。
对拉,需要提到的是,在用脚本的时候,记得先修改成可执行的哦,如:
Quote: |
$chmod 755 path/to/shellscriptfile
|
参考资料太多拉,这里暂时不列举出来哦
翻了一大堆关于套接字和多线程编程的资料。我在其他的几个帖子里头贴出了其中的一些参考资料。
作者: falcon 发表日期: 2006-08-19 08:36
复制链接
学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。
下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。
或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。
下面是我们的代码:
Code:
[Ctrl+A Select All]
下面我们先来编译、执行一下
Quote: |
falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c falcon@falcon:~/program/c/code/ftp$ ./thread_example 我是主函数哦,我正在创建线程,呵呵 线程1被创建 线程2被创建 我是主函数哦,我正在等待线程完成任务阿,呵呵 thread1 : I'm thread 1 thread1 : number = 0 thread2 : I'm thread 2 thread2 : number = 1 thread1 : number = 2 thread2 : number = 3 thread1 : number = 4 thread2 : number = 5 thread1 : number = 6 thread1 : number = 7 thread2 : number = 8 thread1 : number = 9 thread2 : number = 10 thread1 :主函数在等我完成任务吗? 线程1已经结束 thread2 :主函数在等我完成任务吗? 线程2已经结束
|
实例代码里头的注释应该比较清楚了吧,下面我把网路上介绍上面涉及到的几个函数和变量给引用过来。
Quote: |
线程相关操作
一 pthread_t
pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义: typedef unsigned long int pthread_t; 它是一个线程的标识符。
二 pthread_create
函数pthread_create用来创建一个线程,它的原型为: extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的
函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一
节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,
例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一
行代码。
三 pthread_join pthread_exit 函数pthread_join用来等待一个线程的结束。函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数
将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它
的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为: extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给
thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线
程则返回错误代码ESRCH。 在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。
互斥锁相关
互斥锁用来保证一段时间内只有一个线程在执行一段代码。
一 pthread_mutex_init
函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数
pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数
pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值,
PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进程的
不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_
PRIVATE。后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、
PTHREAD_MUTEX_RECURSIVE和PTHREAD
_MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。
二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只
能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一
个线程释放此互斥锁。
|
注意:
需
要说明的是,上面的两处
sleep不光是为了演示的需要,也是为了让线程睡眠一段时间,让线程释放互斥锁,等待另一个线程使用此锁。下面的参考资料1里头说明了该问题。但是在
linux下好像没有pthread_delay_np那个函数(我试了一下,提示没有定义该函数的引用),所以我用了sleep来代替,不过参考资料2
中给出另一种方法,好像是通过pthread_cond_timedwait来代替,里头给出了一种实现的办法。
参考资料:
1。Linux下的多线程编程
http://linux.chinaunix.net/doc/program/2001-08-11/642.shtml
2。pthread_delay_np
http://bbs.chinaunix.net/archiver/?tid-584593.html
作者: falcon 发表日期: 2006-07-14 16:49
复制链接
多进程编程是作为程序员必须熟悉的一个东西哦
下面,我们在linux用系统的fork调用来实现多进程编程练习
先看代码吧
Code:
[Ctrl+A Select All]
再来看看效果
Quote: |
falcon@falcon:~/program/c/code/process$ gcc -o mul_pro_myself mul_pro_myself.c falcon@falcon:~/program/c/code/process$ ./mul_pro_myself I am the child :32063 child_pro: 0 I'm the parent :32062 parent_pro: 0 child_pro: 1 parent_pro: -1 child_pro: 2 child_pro: 3 parent_pro: -2 child_pro: 4 parent_pro: -3 Child exit with:5 Who am I :5 parent_pro: -4 Parent exit with:-5 Who am I :-5
|
看到上面的代码,结合上面的实验结果,我们有个疑问: Who am I? i的值到底是什么呢?
以我们平常的经验,变量i在整个程序里头只可能有一个副本,也就是说在任何一个状态,他的值是唯一的。
但是我们从上面的实验结果可以看出,在多进程的程序里头,情况就不再是这个样子,在不同的进程中保存了不同的副本。
好玩不?
如果对程序有疑问,欢迎查看下面的参考资料哦,非常不错的资料
参考资料:
《linux操作系统下c语言编程入门 》
http://www.mwjx.com/aboutfish/private/book/linux_c.txt
作者: falcon 发表日期: 2006-05-31 18:46
复制链接
先说一下思路哦:
1)先从键盘屏幕接收两个大数,按字符串存放到字符数组中。
2)
初始化进位为0
然后从两个字符数组中分别取出最后一个字符(数字)开始来求和
一直求和到字符串长度较小的最小下标处停止
结果保存较大数字所存放的字符数组中
(说明:
如果结果大于106,那么结果减去58存入,并记录进位为1
否则,结果减去48存入,并记录进位为0
)
3)如果两个数字的位数不相同,那么需要求出最后一位可能的进位
比如5+96=101
4)进位为1,那么和之前需要输出一个1
5)输出两个大数的和
下面是具体代码
Code:
[Ctrl+A Select All]
补充:在ubuntu下用gcc编译通过
部分演示结果
falcon@falcon:~/program/c/code/mylove$ gcc -o add_LN add_LN.c
falcon@falcon:~/program/c/code/mylove$ ./add_LN
Please input two Large Number less than 10000 bit
5
6
两数之和为:
11
falcon@falcon:~/program/c/code/mylove$ ./add_LN
Please input two Large Number less than 10000 bit
877848515165484151
996527784841515184
两数之和为:
1874376300006999335
falcon@falcon:~/program/c/code/mylove$ ./add_LN
Please input two Large Number less than 10000 bit
8995951
784784987951252178485215254798749874984185416845865215187484520512
两数之和为:
784784987951252178485215254798749874984185416845865215187493516463
falcon@falcon:~/program/c/code/mylove$ ./add_LN
Please input two Large Number less than 10000 bit
5
96
两数之和为:
101
guest 发表于 2007-11-20 23:38
#2
你的C语言代码有点小错误!就是在那段:
if(equal==0)
{
Temp=LN[flag1][LN_Len[flag1]+i]+jw;
if(Temp>=58)
{
jw=1;
LN[flag1][LN_Len[flag1]+i]=Temp-10;
}
else
{
jw=0;
LN[flag1][LN_Len[flag1]+i]=Temp;
}
}
缺少了对一直有进位即JW=1时候的累加!应该加上个while循环:
if(equal==0)
{
while(j>0 && jw==1)
{
Temp=LN[flag1][j+i]+jw;
if(Temp>=58)
{
jw=1;
LN[flag1][j+i]=Temp-10;
}
else
{
jw=0;
LN[flag1][j+i]=Temp;
}
j--;
}
并且初始j=LN_Len[flag1]
欢迎访问blog.sina.com.cn/Fanmcgrady与我交流!呵呵~~谢谢你的帮助!
作者: falcon 发表日期: 2006-04-24 14:51
复制链接
引言
前不久刚学会了如何用VB编写DLL动态链接库,但是用vb编写动态链接库比较麻烦些。下面我们再学习一下如何用vc编写dll动态链接库,并且通过vc或者vb调用
正文
这里主要介绍两个东东
第一:用vc编写动态链接库,用vc调用
第二:用vb编写动态链接库,用vb调用
一、用vc编写动态链接库,用vc调用
1、创建DLL文件,命名为FIRSTDLL
1)打开visual c++ 6.0通过new创建一个win30 Dynamic-link Libary的工程,命名为FIRSTDLL
2)接着选择最后一个选项,让系统帮我们创建一些必要的文件
3)把FIRSTDLL.cpp用下面的代码覆盖
Code:
[Ctrl+A Select All]
4)接着我们在FIRSTDLL.h头文件里头用下面的代码覆盖
Code:
[Ctrl+A Select All]
5)好拉,我们现在可以编译FIRSTDLL.cpp文件拉,到debug目录下看看,是不是已经生成拉我们需要的FIRSTDLL.dll拉
2、通过vb编写一个函数来调用该DLL,该函数为USEFIRSTDLL
1)同样通过new创建一个工程,该工程为win30 application,命名USEFIRSTDLL
2)在USEFIRSTDLL.cpp文件中用如下代码覆盖
Code:
[Ctrl+A Select All]
好拉,到这里第一部分介绍完拉
下面介绍第二部分
二、用vc编写动态链接库,用vb调用
在介绍这个之前必须声明的是(引用自下面的参考资料)
一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如: short __stdcall sample(short nLen, short *buffer) 要做到第二条,需要在*.def文件中加上如下的几行: EXPORTS sample @1 这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。
|
|
1、下面我们类似一创建名为SecondDll的DLL文件
1)创建SecondDll,代码如下:
Code:
[Ctrl+A Select All]
2)往我们的工程里头添加一个SecondDll.def文件,内容如下
Code:
[Ctrl+A Select All]
解释一下哦:
@1是表示Max函数在DLL中函数组中是第一个函数,具体见参考资料
ok,保存
编译、创建我们的SecondDll.dll
2、通过Vb调用SecondDll.dll文件,来求两个数中的最大者
我们直接 编写一段代码如下哦
Code:
[Ctrl+A Select All]
看到效果没有啊,在我们的窗体标题中显示拉:"最大值是9"
到这里我们的工作接结束拉,不过要熟练掌握还得多编写程序拉,下面是我在学习时的参考资料,非常详细哦。
在这里,我真的是要谢谢那些专家们为我们免费提供了这么多参考资料,大家要好好珍惜才是,呵呵。
参考资料:
1)基于Visual C++6.0的DLL编程实现 http://hegeng2000.blogchina.com/3807138.html
2)VB和VC混合编程 http://www.china-askpro.com/msg1/qa72.shtml
作者: falcon 发表日期: 2006-04-14 09:54
复制链接
是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱,呵呵。
一起来:
诶,不要着急,我们先来介绍一些网络程序的主要执行过程,主要是便于大家更好的理解下面的程序实例哦 :
1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求。
2)在网络的某台机器上,用户执行客户机程序
3)客户机进行与服务器进程建立一条连接
4)连接建立后,客户机通过网路向服务器发出请求,请求某种服务。
5)服务器接收到客户机的请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回。
6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求。
现在介绍一个实例
功能:实现简单的服务器-客户机编程,客户机发送连接请求后接受到连接成功信息。
代码包括两部分,服务器部分(service.c)和客户机部分(client.c)
Code:
[Ctrl+A Select All]
Code:
[Ctrl+A Select All]
下面我们来编译执行看看效果哦
编译:
#gcc -o service service.c
#gcc -o client client.c
修改执行权限
#chmod 770 service
#chmod 770 client
执行
现执行服务器端哦
#./service
另开一个命令行窗口,连接服务器的3490端口
#./client localhost
呵呵,看到效果了吧
服务器端:
server: got connection from 127.0.0.1
|
|
客户端
[注:以上程序在mandriva linux 2006下调试通过]
从此踏上linux下的网络编程之路,祝贺你一帆风顺...
Good Luck,Babies