apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
Nginx虽然目前使用比较多,但还没有提供整合SVN的功能。
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
还只能是Apache配置SVN,Nginx作为代理。
nginx.conf设置:
server {
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
listen 80;
server_name ppsea.gicp.net;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.1.10:82;
}
}
apache使用的82端口,整合了SVN。
http://blog.ntsky.com/nginx-svn.html
我的使用方法:
server {
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
listen 80;
server_name svn.qq.com;
location / {
root /usr/local/tads/htdocs/svn;
index index.html index.htm;
proxy_pass http://172.25.39.11*:8080;
}
}
一句简单命令重启nginx:
最近我的多个VPS经常出现502错误,经常需要重启nginx,但网上的很多教程都需要繁琐的启动脚本,远不如apache的重启命令那么简单。
但研究了一下nginx帮助后发现,有-s参数可对nginx服务进行管理:
# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/0.7.63
Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-s signal : send signal to a master process: stop, quit, reopen, reload-p prefix : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
于是我执行
# /usr/local/nginx/sbin/nginx -s reload
nginx已经重启成功。
apache 设置虚拟机为8080时候需要修改的地方:
1.httpd.conf
Listen 8080
2.<VirtualHost *:8080>
ServerAdmin jackxiang@tencent.com
1,2必须都要为:8080,否则没法访问8080端口,亲自试了试。
首先,调试通过apache的8080,然后再调试通过nginx的代理即可!!!
When installing PHP and MySQL on OSX you may get the error Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock’. Or you may also get “No such file or directory” when calling mysql_connect from a PHP page. This occurs because PHP is looking for the file mysql.sock in it’s typical installation location of /var/mysql/mysql.sock. However the MySQL OSX installer actually puts the file in /tmp/mysql.sock. There are two easy ways to solve the problem.
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
Solution 1: Create a symbolic link
Open terminal and do the following:
sudo su
mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
You just created a symbolic link in the place where PHP expects the socket file to be located so it should be happy.
Solution 2: Edit php.ini
If you don’t like the idea of creating a symbolic link, you can also simply alter your php.ini file to point PHP to the real location of mysql.sock.
Locate /etc/php.ini. (If php.ini doesn’t exist on your system, copy /etc/php.ini.default to /etc/php.ini). You will likely have to do this from the terminal unless you have Finder configured to show hidden files. Open the file and update the setting mysql.default_socket so it looks like this:
mysql.default_socket = /tmp/mysql.sock
To commit the change you need to restart Apache. You can do that in System Settings -> Sharing, then uncheck, then recheck Web Sharing.
注解:这个问题,在php和Mysql一台及其的时候特别需要注意,否则mysql没法连接上,而php -m|grep mysql 是有的,无法排查,而在链接其他IP机器是没有该问题的,注意下。
来源:http://verysimple.com/2009/01/07/php-on-os-cant-connect-to-local-mysql-server-through-socket-varmysqlmysqlsock/
将nobody用户添加到nogroup 组:
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
usermod -g nogroup nobody
cat /etc/passwd|grep nobody
nobody:x:65534:65534:nobody:/var/lib/nobody:/bin/bash
第3个字段是65534:意思就是,UID(用户的ID)是500.
第4个字段是65534:意思就是.GID(用户的组ID)的500.
使用usermod -g nogroup nobody就可以把已有的用户nobody加入nogroup 组了.
如下:
:nobody:/var/lib/nobody:/bin/bash
添加一个不能ssh登录的用户和制定用户的Home目录位置:
useradd -s /sbin/nologin -d /home/ftpuser -g ftp ftpuser
接下来给用户设置密码,否则此账号不能使用,命令如下
passwd ftpuser
这样就为linux系统添加用户testuser,用户目录指定为//home/ftpuser,属于ftp用户组,且此用户不能登陆系统。
linux可以使用lsof命令能查看到端口对应的进程号:
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
[root@www ~]# lsof -i
COMMAND PID USER FD TYPE DEVICESIZE NODE NAME
Sshd 2444 root 3u IPv4 7376 TCP 172.20.1.104:ssh (LISTEN)
Sshd 16187 root 3u IPv4 327678 TCP 172.20.1.104:ssh->172.20.1.181:56600 (ESTABLISHED)
在windows, 使用netstat -o参数:
-o 显示与每个连接相关的所属进程 ID。
来源:http://hi.baidu.com/fanniwz/blog/item/be108037a50f051b91ef3935.html
#include <iostream>
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
using namespace std;
struct ENTINFO {
char ent_add[255];
};
typedef struct ENTINFO _ENTINFO;
int main(int argc, char *argv[])
{
_ENTINFO *ent_info_pointer;
_ENTINFO ent_info[1024];
memset(ent_info,0,sizeof(_ENTINFO)*1024);
strcpy(ent_info[0].ent_add,"guangdong shenzhen nanshan new haofang garden");
strcpy(ent_info[1].ent_add,"guangdong shenzhen nanshan haofang garden");
strcpy(ent_info[2].ent_add,"guangdong shenzhen nanshan haofang garden 6 floor");
ent_info_pointer = ent_info;
printf("ent_info_pointer->ent_add=%s\n",ent_info[0].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[1].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info[2].ent_add);
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
ent_info_pointer++;
printf("ent_info_pointer->ent_add=%s\n",ent_info_pointer->ent_add);
return 0;
}
运行结果:
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
ent_info_pointer->ent_add=guangdong shenzhen nanshan new haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden
ent_info_pointer->ent_add=guangdong shenzhen nanshan haofang garden 6 floor
strcture_array_test.cpp
root@17*.2*.38.78:~/c++/struct# ./a.out
No. Name sex age Score
10101Tom M 18 0
10102John M 19 0
10103Mary F 17 0
Grep -E参数,加上正则表达式实现,多个函数查找,如下:
配上shell 文件 findfunPath.sh如下:
简单示例:
grep -Erin 'atoi|itoa|atol|ltoa|intval' ./
配上shell 文件 findfunPath.sh如下:
#!/bin/bash
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
findPath=$1
#judge folder is exist
if [ ! -d "$findPath" ]; then
echo "Sorry,Input path is not exist.";
echo "You can try follow command to check it: ls ${findPath}";
exit 0
fi
grep -Erin 'atoi|itoa|atol|ltoa|intval' ${findPath}|awk -F":" '{print "\nFileLineNumber=" $2 " ExistFileName=" $1 "\nDetailInfo
=" $0}'
简单示例:
findfunPath.sh /usr/local/pro/
找出消耗内存最多的前10名进程
# ps -auxf | sort -nr -k 4 | head -10
找出使用CPU最多的前10名进程
# ps -auxf | sort -nr -k 3 | head -10
特别是默认空格,的时候,可以通过:
cat outok.txt |awk '{print $5}'|sort -k 1
来得知是第几列:awk输出$1,$2,$3挨个看看就知道了。
示例:
sort -k5 outok.txt
//第5咧排序即可,空格分割。参数说明:
sort的-r选项:
sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。
sort的-u选项:
它的作用很简单,就是在输出行中去除重复行。
sort的-n选项:
我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!
sort提供了-t选项,后面可以设定间隔符。
指定了间隔符之后,就可以用-k来指定列数了。
参数:
-t表示分割符,以:分割,默认情况下以空格分割
-k作用是根据某个列来排序,这里根据第3列,默认是第1列(从1开始)。
-n按照数字方式排序。不加-n参数时排序结果根据最左面的数字开始,等同于字母的比较方式。
=========================================================
其他的sort常用选项
-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1
-M会以月份来排序,比如JAN小于FEB等等
-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。
=========================================================
阅读全文
if elif else demo:
wile demo:
函数示例:
#example
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
if [ $1 -gt 90 ];then
echo "Good, $1"
elif [ $1 -gt 70 ];then
echo "OK, $1"
else
echo "Bad, $1"
fi
wile demo:
#example
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
i=1
sum=0
while test $i -le 100
do
let sum=$sum+$i
let i=$i+1
done
echo "1+2+3...+100="$sum
函数示例:
#example
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
function add()
{
let $3=$1+$2
}
add 1 2 ret
echo $ret
这让我想到一个很有意思的事情就是大家熟悉的琼瑶阿姨,她是“追求爱情顺便结婚”。在华人历史上他可以说是唯一一个追求爱情,享受爱情,靠爱情养活自己,最终成就爱情的女性。她的故事已广为人知,在中学因为谈恋爱而被家里人责怪,最后失恋写了窗外,之后投稿投了十几年,最后和出版社老板爱上了,这个过程本身就是一个故事。最后所有作品拍成电视剧,在台湾广受欢迎,最后养活了她自己,改善了她的生活。大陆开放这些作品,在大陆重新贩卖,重新在大陆掀起新的爱情故事,她又收获了新的视野,她现在在享受她爱情的生活。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我们身边也常常看到另外一类女孩子,她们追求婚姻,顺便爱情。同样,我们身边也有一些人开会的时候和对外发言的时候讲一讲理想,实际上关起门来总是庆幸自己赚多少钱。甚至一些上市的创业板公司,也是追求金钱顺便谈谈理想。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我也看到很多做房地产企业,他们真的是只在考虑自己赚钱的事情,做出短视的决策。比如说客户有投诉,追求理想的企业会第一时间反应让客户满意,要改善,这是追求理想,很简单的事情,他要考虑长期的公司价值以及社会责任。追求金钱公司会怎么样,他会找保安把这个客户威胁,收拾,当下把这个事摁下去,处理这类事两个老板看见的东西不一样,前者看到是未来,后者看到是现在的问题。一远一近处理事情的方法是差之千里。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 追求理想也会让我们算帐的方法跟普通人不一样,企业最难的是算帐,创业者之所以会面临算不清楚的帐,大体三个原因,第一是时间原因,一个事情的时间会决定这个事情的价值。比如我在这里喝水喝一下是解渴,喝很多是艺术,喝死就是文物。我们只要坚持,时间会改变一切。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我们身边也常常看到另外一类女孩子,她们追求婚姻,顺便爱情。同样,我们身边也有一些人开会的时候和对外发言的时候讲一讲理想,实际上关起门来总是庆幸自己赚多少钱。甚至一些上市的创业板公司,也是追求金钱顺便谈谈理想。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 我也看到很多做房地产企业,他们真的是只在考虑自己赚钱的事情,做出短视的决策。比如说客户有投诉,追求理想的企业会第一时间反应让客户满意,要改善,这是追求理想,很简单的事情,他要考虑长期的公司价值以及社会责任。追求金钱公司会怎么样,他会找保安把这个客户威胁,收拾,当下把这个事摁下去,处理这类事两个老板看见的东西不一样,前者看到是未来,后者看到是现在的问题。一远一近处理事情的方法是差之千里。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 追求理想也会让我们算帐的方法跟普通人不一样,企业最难的是算帐,创业者之所以会面临算不清楚的帐,大体三个原因,第一是时间原因,一个事情的时间会决定这个事情的价值。比如我在这里喝水喝一下是解渴,喝很多是艺术,喝死就是文物。我们只要坚持,时间会改变一切。
会改变一切。 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。 《风马牛:冯仑和他的快意人生》当当网订购专线卓越网订购专线欢迎访问“风马牛集中营”www.fengmaniu.com 第二个就是和谁做非常重要,和谁做呢?我们经常开玩笑说大家都熟悉天上人间有很多劳动妇女最近被清退。如果她碰到是坏人就是卖淫嫖娼,是蔡锷就是千古风流,如果是更伟大的人也许就是国母,姿势一样,行为一样,跟的人不一样,结果就很不一样。
grep -v ^$ oldfile >newfile
但是似乎在FreeBSD下面不行,会不会是grep版本的问题?
后来想到了很刁的vim的全局替换,最后成功
vim的命令为:%s/^\n//g
意思是全局替换所有以回车开头的字符,替换为空。
顺便研究了一下
如果有多个连续的空行,想保留一个
vim的命令为:%s/^\n$//g
原文出自:http://soft.chinabyte.com/os/120/11507620.shtml
但是似乎在FreeBSD下面不行,会不会是grep版本的问题?
后来想到了很刁的vim的全局替换,最后成功
vim的命令为:%s/^\n//g
意思是全局替换所有以回车开头的字符,替换为空。
顺便研究了一下
如果有多个连续的空行,想保留一个
vim的命令为:%s/^\n$//g
原文出自:http://soft.chinabyte.com/os/120/11507620.shtml
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
我采用:
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
[sam@chenwy sam]$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
我采用:
grep -Erin 'atoi|itoa|atol|ltoa' ./
~/grep# grep -Erin 'atoi|itoa|atol|ltoa' ./
./itoa.txt:1:itoa
./itoa.txt:2:atoi
./itoa.txt:3:atoi
./itoa.txt:4:atoi
./itoa.txt:5:atoi
./atoi.txt:1:atoi
./atoi.txt:2:atoi
./atoi.txt:3:atoi
./atoi.txt:4:atoi
./atoi.txt:5:atoi
./atol.txt:1:atol
./atol.txt:2:atol
./atol.txt:3:atol
./atol.txt:4:atol
./atol.txt:5:atol
./atol.txt:6:atol
./ltoa.txt:1:ltoa
./ltoa.txt:2:ltoa
./ltoa.txt:3:ltoa
./ltoa.txt:4:ltoa
./ltoa.txt:5:ltoa
./ltoa.txt:6:ltoa
阅读全文
亦庄,立足于北京国际新城的新高度,随着政策的利好导向,正在高速前行,成为北京在世界的代言。亦庄路东区作为以产业为主导功能的片区成为重点区域。丰富的交通资源为区域发展提供动力,亦庄线、M12线在此交会, 2010年年底开通的轻轨亦庄线,北接地铁5号线,20分钟直抵宋家庄。M12建成后通达国贸,将与CBD区域融合。
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!
双轨建构 京南置业黄金点
距L2和M12换乘站经海路站仅280米VITA国际,于2010年11月11日破土动工, 11月12日售楼处开放。是目前北京距离地铁最近的在售低总价精装小户型,业主出门即可便捷接入北京城市地铁网。在经历通州、奥北、中关村等轻轨沿线不动产购置热潮之后,VITA国际的轨道效应将引领新一轮资本流向,开启全新地铁时代。
与VITA国际一个街区之隔,将建造亦庄的公交枢纽站,届时公交枢纽将实现“零距离”换乘。VITA国际门前双轨交会,瞬间直抵繁华。
保守估计:从开盘到交房每平米净赚4000非常轻松。仅供参考!
欢迎来电垂询:13269811169 陈娅婷
11月20日正式接受排号!排号可享受优惠!
首先博主抛出一个疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
好了,现在切入正题:今天博主在linux环境下实现了一个小小RPC通信,按照惯例,做一下总结吧。
原先博主用的是Red hat9,安装完red hat后不想系统不带GCC,然后博主跑遍各大linux论坛搜寻装GCC的步骤,虽然取得些微的进步,对linux也有一些初步的认识了,但是系统还是不能用。无奈,博主就跑去问老师如何解决linux安装C编译器,不想linux老师来了一句这个red hat他已经不玩好多年了,然后建议我去玩ubuntu。于是,博主就屁颠屁颠地跑去下载最新的ubuntu 10.4,然后安装。出乎意料的是,ubuntu安装要比red hat方便多了,基本属于傻瓜式操作。
所以,接下来博主要讲的基本都是基于ubuntu 10.4平台的。
虽然是新平台,但是ubuntu用的还是linux内核,所以基本和red hat差不多,只有些微差别。
这次操作比上次在red hat上操作顺利多了,博主是参照下文的步骤一步一步实现rpc的:
1. 根据rpc调用的功能,先不考虑rpc调用,编写一个平常的实现相应功能的程序。
如一个远程的文件传输的rpc调用,平常程序便是考虑文件存储在本地,直接打开读便可,如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
printf("Enter File Name: ");
scanf("%s", name);
printf("%s", readfile(name));
}
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
2. 把程序拆分为两部分,main函数和readfile函数,带有main的一部分是主动发起调用的,在rpc中相当于客户端,带有readfile函数的部分是提供相应的功能的,相当于服务器端。将代码拆分后要在客户端添加相应的rpc调用函数,clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
FILETRANSPROG便是trans.x中的程序名,FILETRANSVERS是版本名,使用tcp进行rpc调用。
拆分后代码如下:
客户端client.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include "trans.h"
#define WSVERS MAKEWORD(0, 2)
#define RMACHINE "localhost"
CLIENT *handle;
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
char * buf;
printf("Enter File Name: ");
scanf("%s", name);
handle = clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
if (handle == 0) {
printf("Could Not Connect To Remote Server.\n");
exit(1);
}
buf = readfile(name);
printf("%s", buf);
return 0;
}
服务器端server.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include "trans.h"
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
3. 编写***.x文件。具体步骤可以参考Douglas的那本Internetworking With TCP/IP 的第三卷,客户端-服务器端编程与应用。
本程序的.x文件命名为trans.x内容如下:
const MAXLENGTH = 1024;
const MAXNAME = 20;
program FILETRANSPROG //程序名
{
version FILETRANSVERS //版本名
{
string READFILE(string) = 1; //调用的方法名
} = 1;
} = 99;
4. 使用rpcgen编辑.x文件,在linux下输入命令
rpcgen trans.x
若格式正确,编译无错误则产生三个文件trans.h,trans_svc.c(服务器端),trans_clnt.c(客户端)。因为上述trans.x中无自定义数据结构,所以没有xdr文件产生。
trans.h代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _TRANS_H_RPCGEN
#define _TRANS_H_RPCGEN
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAXLENGTH 1024
#define MAXNAME 20
#define FILETRANSPROG 99
#define FILETRANSVERS 1
#if defined(__STDC__) || defined(__cplusplus)
#define READFILE 1
extern char ** readfile_1(char **, CLIENT *);
extern char ** readfile_1_svc(char **, struct svc_req *);
extern int filetransprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define READFILE 1
extern char ** readfile_1();
extern char ** readfile_1_svc();
extern int filetransprog_1_freeresult ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_TRANS_H_RPCGEN */
trans_svc.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include "trans.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
static void
filetransprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
union {
char *readfile_1_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case READFILE:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_wrapstring;
local = (char *(*)(char *, struct svc_req *)) readfile_1;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}
int
main (int argc, char **argv)
{
register SVCXPRT *transp;
pmap_unset (FILETRANSPROG, FILETRANSVERS);
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, udp).");
exit(1);
}
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, tcp).");
exit(1);
}
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
trans_clnt.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include <memory.h> /* for memset */
#include "trans.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
char **
readfile_1(char **argp, CLIENT *clnt)
{
static char *clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, READFILE,
(xdrproc_t) xdr_wrapstring, (caddr_t) argp,
(xdrproc_t) xdr_wrapstring, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
5. 编写客户端和服务器端接口。此部分可以说是最麻烦的部分,稍不注意便会出错,同样可以参考Douglas的那本书,但要注意的是他的服务器接口例程代码中的每个函数的第二个参数应该是CLIENT *clnt, 而非struct svc_req * rqstp
为本程序编写的代码如下:
客户端接口文件trans_cif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"/* Client-side stub interface routines written by programmer */
extern CLIENT * handle;
static char **ret;
char * readfile(char * name)
{
char ** arg;
arg = &name;
ret = readfile_1(arg, handle);
return ret==NULL ? NULL : *ret;
}
服务器端接口文件trans_sif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"
char * readfile(char *);
static char * retcode;
char ** readfile_1(char ** w, CLIENT *clnt)
{
retcode = readfile(*(char**)w);
return &retcode;
}
6. 编译链接客户端和服务器端程序
不管是客户端还是服务器端,都要链接三个文件,
客户端:程序文件+*** _clnt.c+客户端接口文件。
服务器端:程序文件+*** _svc.c+服务器端接口文件
同时每一段的三个文件都是互相关联的,编译出现错误时,可以根据提示查看三个文件进行debug
命令如下:
gcc -Wall -o trans_client client.c trans_clnt.c trans_cif.c
gcc -Wall -o trans_server server.c trans_svc.c trans_sif.c
7. 启动服务器端和客户端,大功告成。要先运行服务器端程序,再运行客户端程序。命令如下:
./trans_server
./trans_client
client启动后,提示输入要传输的文件名,输入后,server将文件的第一行传回,大功告成!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/symbol89/archive/2009/06/21/4285142.aspx
----------------------------------------------------------------------------------------------------------------------------------------------------
博主按照上面的指示一步一步做下来,还算顺利。但是在链接服务端文件时爆出一个错误,意思是trans_svc.c这个文件有个undefined reference to 'readfile_1_svc'错误,经本人亲测,是由于trans_svc.c文件第37行原本应该是local = (char*(*)(char *,struct svc_reg *))readfile_1;的,但是rpc编译器翻译成local = (char*(*)(char *,struct svc_reg *))readfile_1_svc ,所以把_svc去掉就好了。
这里不得不提的是ubuntu的vi编辑器相当不好用。即没有装vim,操作起来也没有red hat的vi编译器那样用的那么顺手。这里强烈推荐鸟哥的vi编辑器入门手册。把vi编译器介绍的很详细,附上地址:http://linux.vbird.org/linux_basic/0310vi.php。
vi编辑器模式图(转载自鸟哥的私房菜)
vi模式下指令汇总(转载自鸟哥的私房菜)
最后强烈推荐《鸟哥的私房菜》这本书,相当棒的讲解linux的一套书(有专门的网站)。分上下册,上册讲解linux的基本知识和指令,下册讲linux架站的知识。很实用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
最后运行./trans_server时系统会爆出cannot connect to...的错误(具体的我也忘了),这是由于linux默认把端口映射服务关闭的缘故。这时可以参照下面的解决方法:
$ sudo apt-get install nfs-kernel-server nfs-common portmap
$ sudo dpkg-reconfigure portmap
在出现如下提示的时候,注意选定“不将portmap 绑定在loopback 地址”
之后,系统会有如下提示:
Current registered services:
------------------------------------------------
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
…
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
之后通过查看 /etc/default/portmap, 确保
#OPTIONS="-i 127.0.0.1"
前面的#号 被添加了
重启portmap服务:
$ sudo /etc/init.d/portmap restart
这样就可以了,但是要用root权限执行。
到这里所有我所遇到的问题都解决了,但是博主仍有疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
本文出自 “只争朝夕” 博客,请务必保留此出处http://xiaovfight.blog.51cto.com/1625426/398745
好了,现在切入正题:今天博主在linux环境下实现了一个小小RPC通信,按照惯例,做一下总结吧。
原先博主用的是Red hat9,安装完red hat后不想系统不带GCC,然后博主跑遍各大linux论坛搜寻装GCC的步骤,虽然取得些微的进步,对linux也有一些初步的认识了,但是系统还是不能用。无奈,博主就跑去问老师如何解决linux安装C编译器,不想linux老师来了一句这个red hat他已经不玩好多年了,然后建议我去玩ubuntu。于是,博主就屁颠屁颠地跑去下载最新的ubuntu 10.4,然后安装。出乎意料的是,ubuntu安装要比red hat方便多了,基本属于傻瓜式操作。
所以,接下来博主要讲的基本都是基于ubuntu 10.4平台的。
虽然是新平台,但是ubuntu用的还是linux内核,所以基本和red hat差不多,只有些微差别。
这次操作比上次在red hat上操作顺利多了,博主是参照下文的步骤一步一步实现rpc的:
1. 根据rpc调用的功能,先不考虑rpc调用,编写一个平常的实现相应功能的程序。
如一个远程的文件传输的rpc调用,平常程序便是考虑文件存储在本地,直接打开读便可,如下:
#include <stdio.h>
#include <stdlib.h>
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
printf("Enter File Name: ");
scanf("%s", name);
printf("%s", readfile(name));
}
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
2. 把程序拆分为两部分,main函数和readfile函数,带有main的一部分是主动发起调用的,在rpc中相当于客户端,带有readfile函数的部分是提供相应的功能的,相当于服务器端。将代码拆分后要在客户端添加相应的rpc调用函数,clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
FILETRANSPROG便是trans.x中的程序名,FILETRANSVERS是版本名,使用tcp进行rpc调用。
拆分后代码如下:
客户端client.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include "trans.h"
#define WSVERS MAKEWORD(0, 2)
#define RMACHINE "localhost"
CLIENT *handle;
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char *);
int main()
{
char name[MAXNAME];
char * buf;
printf("Enter File Name: ");
scanf("%s", name);
handle = clnt_create(RMACHINE, FILETRANSPROG, FILETRANSVERS,"tcp");
if (handle == 0) {
printf("Could Not Connect To Remote Server.\n");
exit(1);
}
buf = readfile(name);
printf("%s", buf);
return 0;
}
服务器端server.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include <stdlib.h>
#include "trans.h"
#define MAXNAME 20
#define MAXLENGTH 1024
char * readfile(char * name)
{
FILE *file = fopen(name, "r");
char * buf = (char *)malloc(sizeof(char)*MAXLENGTH);
if (file == NULL)
{
printf("File Cann't Be Open!");
return 0;
}
printf("The File Content is : \n");
while (fgets(buf, MAXLENGTH-1, file) != NULL)
{
return buf;
}
return NULL;
}
3. 编写***.x文件。具体步骤可以参考Douglas的那本Internetworking With TCP/IP 的第三卷,客户端-服务器端编程与应用。
本程序的.x文件命名为trans.x内容如下:
const MAXLENGTH = 1024;
const MAXNAME = 20;
program FILETRANSPROG //程序名
{
version FILETRANSVERS //版本名
{
string READFILE(string) = 1; //调用的方法名
} = 1;
} = 99;
4. 使用rpcgen编辑.x文件,在linux下输入命令
rpcgen trans.x
若格式正确,编译无错误则产生三个文件trans.h,trans_svc.c(服务器端),trans_clnt.c(客户端)。因为上述trans.x中无自定义数据结构,所以没有xdr文件产生。
trans.h代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#ifndef _TRANS_H_RPCGEN
#define _TRANS_H_RPCGEN
#include <rpc/rpc.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAXLENGTH 1024
#define MAXNAME 20
#define FILETRANSPROG 99
#define FILETRANSVERS 1
#if defined(__STDC__) || defined(__cplusplus)
#define READFILE 1
extern char ** readfile_1(char **, CLIENT *);
extern char ** readfile_1_svc(char **, struct svc_req *);
extern int filetransprog_1_freeresult (SVCXPRT *, xdrproc_t, caddr_t);
#else /* K&R C */
#define READFILE 1
extern char ** readfile_1();
extern char ** readfile_1_svc();
extern int filetransprog_1_freeresult ();
#endif /* K&R C */
#ifdef __cplusplus
}
#endif
#endif /* !_TRANS_H_RPCGEN */
trans_svc.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include "trans.h"
#include <stdio.h>
#include <stdlib.h>
#include <rpc/pmap_clnt.h>
#include <string.h>
#include <memory.h>
#include <sys/socket.h>
#include <netinet/in.h>
#ifndef SIG_PF
#define SIG_PF void(*)(int)
#endif
static void
filetransprog_1(struct svc_req *rqstp, register SVCXPRT *transp)
{
union {
char *readfile_1_arg;
} argument;
char *result;
xdrproc_t _xdr_argument, _xdr_result;
char *(*local)(char *, struct svc_req *);
switch (rqstp->rq_proc) {
case NULLPROC:
(void) svc_sendreply (transp, (xdrproc_t) xdr_void, (char *)NULL);
return;
case READFILE:
_xdr_argument = (xdrproc_t) xdr_wrapstring;
_xdr_result = (xdrproc_t) xdr_wrapstring;
local = (char *(*)(char *, struct svc_req *)) readfile_1;
break;
default:
svcerr_noproc (transp);
return;
}
memset ((char *)&argument, 0, sizeof (argument));
if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
svcerr_decode (transp);
return;
}
result = (*local)((char *)&argument, rqstp);
if (result != NULL && !svc_sendreply(transp, (xdrproc_t) _xdr_result, result)) {
svcerr_systemerr (transp);
}
if (!svc_freeargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) {
fprintf (stderr, "%s", "unable to free arguments");
exit (1);
}
return;
}
int
main (int argc, char **argv)
{
register SVCXPRT *transp;
pmap_unset (FILETRANSPROG, FILETRANSVERS);
transp = svcudp_create(RPC_ANYSOCK);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create udp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_UDP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, udp).");
exit(1);
}
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
fprintf (stderr, "%s", "cannot create tcp service.");
exit(1);
}
if (!svc_register(transp, FILETRANSPROG, FILETRANSVERS, filetransprog_1, IPPROTO_TCP)) {
fprintf (stderr, "%s", "unable to register (FILETRANSPROG, FILETRANSVERS, tcp).");
exit(1);
}
svc_run ();
fprintf (stderr, "%s", "svc_run returned");
exit (1);
/* NOTREACHED */
}
trans_clnt.c代码:
/*
* Please do not edit this file.
* It was generated using rpcgen.
*/
#include <memory.h> /* for memset */
#include "trans.h"
/* Default timeout can be changed using clnt_control() */
static struct timeval TIMEOUT = { 25, 0 };
char **
readfile_1(char **argp, CLIENT *clnt)
{
static char *clnt_res;
memset((char *)&clnt_res, 0, sizeof(clnt_res));
if (clnt_call (clnt, READFILE,
(xdrproc_t) xdr_wrapstring, (caddr_t) argp,
(xdrproc_t) xdr_wrapstring, (caddr_t) &clnt_res,
TIMEOUT) != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
5. 编写客户端和服务器端接口。此部分可以说是最麻烦的部分,稍不注意便会出错,同样可以参考Douglas的那本书,但要注意的是他的服务器接口例程代码中的每个函数的第二个参数应该是CLIENT *clnt, 而非struct svc_req * rqstp
为本程序编写的代码如下:
客户端接口文件trans_cif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"/* Client-side stub interface routines written by programmer */
extern CLIENT * handle;
static char **ret;
char * readfile(char * name)
{
char ** arg;
arg = &name;
ret = readfile_1(arg, handle);
return ret==NULL ? NULL : *ret;
}
服务器端接口文件trans_sif.c:
#include <rpc/rpc.h>
#include <stdio.h>
#include "trans.h"
char * readfile(char *);
static char * retcode;
char ** readfile_1(char ** w, CLIENT *clnt)
{
retcode = readfile(*(char**)w);
return &retcode;
}
6. 编译链接客户端和服务器端程序
不管是客户端还是服务器端,都要链接三个文件,
客户端:程序文件+*** _clnt.c+客户端接口文件。
服务器端:程序文件+*** _svc.c+服务器端接口文件
同时每一段的三个文件都是互相关联的,编译出现错误时,可以根据提示查看三个文件进行debug
命令如下:
gcc -Wall -o trans_client client.c trans_clnt.c trans_cif.c
gcc -Wall -o trans_server server.c trans_svc.c trans_sif.c
7. 启动服务器端和客户端,大功告成。要先运行服务器端程序,再运行客户端程序。命令如下:
./trans_server
./trans_client
client启动后,提示输入要传输的文件名,输入后,server将文件的第一行传回,大功告成!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/symbol89/archive/2009/06/21/4285142.aspx
----------------------------------------------------------------------------------------------------------------------------------------------------
博主按照上面的指示一步一步做下来,还算顺利。但是在链接服务端文件时爆出一个错误,意思是trans_svc.c这个文件有个undefined reference to 'readfile_1_svc'错误,经本人亲测,是由于trans_svc.c文件第37行原本应该是local = (char*(*)(char *,struct svc_reg *))readfile_1;的,但是rpc编译器翻译成local = (char*(*)(char *,struct svc_reg *))readfile_1_svc ,所以把_svc去掉就好了。
这里不得不提的是ubuntu的vi编辑器相当不好用。即没有装vim,操作起来也没有red hat的vi编译器那样用的那么顺手。这里强烈推荐鸟哥的vi编辑器入门手册。把vi编译器介绍的很详细,附上地址:http://linux.vbird.org/linux_basic/0310vi.php。
vi编辑器模式图(转载自鸟哥的私房菜)
vi模式下指令汇总(转载自鸟哥的私房菜)
最后强烈推荐《鸟哥的私房菜》这本书,相当棒的讲解linux的一套书(有专门的网站)。分上下册,上册讲解linux的基本知识和指令,下册讲linux架站的知识。很实用。
-----------------------------------------------------------------------------------------------------------------------------------------------------
最后运行./trans_server时系统会爆出cannot connect to...的错误(具体的我也忘了),这是由于linux默认把端口映射服务关闭的缘故。这时可以参照下面的解决方法:
$ sudo apt-get install nfs-kernel-server nfs-common portmap
$ sudo dpkg-reconfigure portmap
在出现如下提示的时候,注意选定“不将portmap 绑定在loopback 地址”
之后,系统会有如下提示:
Current registered services:
------------------------------------------------
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
…
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
之后通过查看 /etc/default/portmap, 确保
#OPTIONS="-i 127.0.0.1"
前面的#号 被添加了
重启portmap服务:
$ sudo /etc/init.d/portmap restart
这样就可以了,但是要用root权限执行。
到这里所有我所遇到的问题都解决了,但是博主仍有疑问,如何实现windows和linux之间的rpc通信,这两个异构的系统如何才能建立变量传递通道,这相当困扰博主,如有好心人指点,将不胜感激。
本文出自 “只争朝夕” 博客,请务必保留此出处http://xiaovfight.blog.51cto.com/1625426/398745
fms在centos linux 4.x上可以正常安装,装完了就可以自已自动启来了。但是在centos linux 5.x上,装完后启动不了。日志内也没有任何错误信息。
安装:
./installFMS -platformWarnOnly
安装完成后FMS服务没有自动启来,日志内也没有任何错误信息。
我们通过看/etc/init.d/fms这个启动脚本,发现FMS启动主要是用到了fmsmaster start。手动跑fmsmaster start发现出错。
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libssl.so.4: cannot open shared object file: No such file or directory
libssl.so.4是这个链接,在5.x上版本上没有建,手动建立:
[root@fms1 fms]# ln -s /usr/lib/libssl.so /usr/lib/libssl.so.4
再启动:
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
再建链接:
[root@fms1 fms]# ln -s /usr/lib/libcrypto.so /usr/lib/libcrypto.so.4
OK,FMS可以正常启动了。
来源:http://hi.baidu.com/farmerluo/blog/item/32bfd42a7790d398023bf65e.html
参考:http://mimieye.iteye.com/blog/103755
http://blog.bj50.net/black/?p=184
下载:http://blog.csdn.net/xiang08/article/details/4136670
https://www.adobe.com/cfusion/tdrc/index.cfm?loc=zh_cn&product=flashmediaserver
安装:
./installFMS -platformWarnOnly
安装完成后FMS服务没有自动启来,日志内也没有任何错误信息。
我们通过看/etc/init.d/fms这个启动脚本,发现FMS启动主要是用到了fmsmaster start。手动跑fmsmaster start发现出错。
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libssl.so.4: cannot open shared object file: No such file or directory
libssl.so.4是这个链接,在5.x上版本上没有建,手动建立:
[root@fms1 fms]# ln -s /usr/lib/libssl.so /usr/lib/libssl.so.4
再启动:
[root@fms1 fms]# ./fmsmaster start
./fmsmaster: error while loading shared libraries: libcrypto.so.4: cannot open shared object file: No such file or directory
再建链接:
[root@fms1 fms]# ln -s /usr/lib/libcrypto.so /usr/lib/libcrypto.so.4
OK,FMS可以正常启动了。
来源:http://hi.baidu.com/farmerluo/blog/item/32bfd42a7790d398023bf65e.html
参考:http://mimieye.iteye.com/blog/103755
http://blog.bj50.net/black/?p=184
下载:http://blog.csdn.net/xiang08/article/details/4136670
https://www.adobe.com/cfusion/tdrc/index.cfm?loc=zh_cn&product=flashmediaserver
每个周日10点,重启Apache Server:
* * * * * program
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
当第1列 为 * 时表示每分钟都要执行 program,第2列为 * 时表示每小时都要执行程式,其余类推
当第1列为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,第2列为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当第1列为 */n 时表示每 n 分钟个时间间隔执行一次,第2列 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
当第1列为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,第2列 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd
10 1 * * 0 /usr/local/apache2/bin/apachectl restart
* * * * * program
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
当第1列 为 * 时表示每分钟都要执行 program,第2列为 * 时表示每小时都要执行程式,其余类推
当第1列为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,第2列为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当第1列为 */n 时表示每 n 分钟个时间间隔执行一次,第2列 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
当第1列为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,第2列 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推
crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启lighttpd 。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启lighttpd 。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启lighttpd
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启lighttpd
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启lighttpd
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启lighttpd
最近发现一个问题:
window.location.href在IE6下面竟然不跳转,这是为什么呢?
这个是我写的语句:
<a href="javascript:void(0);" ;onclick="javascript:window.location.href='http://www.sina.com';">转到新浪</a>
后面是网上找到了解决方案(URL:http://www.cnblogs.com/kaima/archive/2008/08/22/1273808.html):
<script type="text/javascript">
function goUrl(x)
{
window.location.href=x;
}
</script>
<a href="javascript:;" onclick="javascript:goUrl('http://www.sina.com');">跳转1</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');">跳转2</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');return false;">跳转3</a>
<a href="#" onclick="javascript:goUrl('http://www.sina.com');">跳转4</a>
<a href="###" onclick="javascript:goUrl('http://www.sina.com');">跳转5</a>
测试环境IE6,IE7,Firefox 3。
跳转1和2在IE6环境下无效,3、4、5在IE6,IE7,Firefox3.01下测试均能 通过,。
跳转4和5最简洁。
关键在于<a>的href属性,空链接用"#","###"。
为了不返回网页顶端。
空链接推荐用"###"。
我采用了第三种方法,在后面加了return false;这样,IE6、IE7、FF3下面全部通过。
来源:http://blog.163.com/leaf-shi/blog/static/12749133020098109215329/
window.location.href在IE6下面竟然不跳转,这是为什么呢?
这个是我写的语句:
<a href="javascript:void(0);" ;onclick="javascript:window.location.href='http://www.sina.com';">转到新浪</a>
后面是网上找到了解决方案(URL:http://www.cnblogs.com/kaima/archive/2008/08/22/1273808.html):
<script type="text/javascript">
function goUrl(x)
{
window.location.href=x;
}
</script>
<a href="javascript:;" onclick="javascript:goUrl('http://www.sina.com');">跳转1</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');">跳转2</a>
<a href="javascript:void(0);" onclick="javascript:goUrl('http://www.sina.com');return false;">跳转3</a>
<a href="#" onclick="javascript:goUrl('http://www.sina.com');">跳转4</a>
<a href="###" onclick="javascript:goUrl('http://www.sina.com');">跳转5</a>
测试环境IE6,IE7,Firefox 3。
跳转1和2在IE6环境下无效,3、4、5在IE6,IE7,Firefox3.01下测试均能 通过,。
跳转4和5最简洁。
关键在于<a>的href属性,空链接用"#","###"。
为了不返回网页顶端。
空链接推荐用"###"。
我采用了第三种方法,在后面加了return false;这样,IE6、IE7、FF3下面全部通过。
来源:http://blog.163.com/leaf-shi/blog/static/12749133020098109215329/
Smarty最大的功能是做模版的页面缓存。也就是通过Smarty可以完成两个步骤:编译+解析
第一步:编译。是指把模版文件的标签替换为纯php,再保存在缓存位置,保存的文件扩展名是PHP,我把这个步骤叫做编译(这是我自己的叫法,不是官方的)
第二步:解析。也就是把刚才编译的PHP文件解析执行而已~~这个就不用多做解释了
切入正题,在Smarty.class.php文件中加入如下代码
这个函数的作用就是保存文件~~
调用方法如下
来源:http://blog.163.com/junsheng_zheng/blog/static/110710882200911211162510/
第一步:编译。是指把模版文件的标签替换为纯php,再保存在缓存位置,保存的文件扩展名是PHP,我把这个步骤叫做编译(这是我自己的叫法,不是官方的)
第二步:解析。也就是把刚才编译的PHP文件解析执行而已~~这个就不用多做解释了
切入正题,在Smarty.class.php文件中加入如下代码
function MakeHtmlFile($file_name, $content)
{ //目录不存在就创建
if (!file_exists (dirname($file_name))) {
if (!@mkdir (dirname($file_name), 0777)) {
die($file_name."目录创建失败!");
}
}
if(!$fp = fopen($file_name, "w")){
echo "文件打开失败!";
return false;
}
if(!fwrite($fp, $content)){
echo "文件写入失败!";
fclose($fp);
return false;
}
fclose($fp);
chmod($file_name,0666);
}
{ //目录不存在就创建
if (!file_exists (dirname($file_name))) {
if (!@mkdir (dirname($file_name), 0777)) {
die($file_name."目录创建失败!");
}
}
if(!$fp = fopen($file_name, "w")){
echo "文件打开失败!";
return false;
}
if(!fwrite($fp, $content)){
echo "文件写入失败!";
fclose($fp);
return false;
}
fclose($fp);
chmod($file_name,0666);
}
这个函数的作用就是保存文件~~
调用方法如下
require '../libs/Smarty.class.php';
$smarty = new Smarty;
//…………省略变量定义和赋值
//$smarty->display('index.tpl');
$content=$smarty->fetch("index.tpl");
$smarty->MakeHtmlFile('./index.html',$content);//生成
$smarty = new Smarty;
//…………省略变量定义和赋值
//$smarty->display('index.tpl');
$content=$smarty->fetch("index.tpl");
$smarty->MakeHtmlFile('./index.html',$content);//生成
来源:http://blog.163.com/junsheng_zheng/blog/static/110710882200911211162510/





