存档

文章标签 ‘Linux’

linux下获取当前程序的绝对路径

二月 25th, {2010 没有评论 4,818 人阅读过  

在linux下运行的程序经常需要获取自己的绝对路径,程序可能需要引用外部的资源文件,比如在../skin/目录下的图片,这样普通程序是没有问题,但当程序在安装到/usr/bin/目录中,或者为程序建立连接以后就会出现问题,我们可以直接通过运行程序的链接来运行程序,这样../skin/目录就找不到了,因为当前目录并不是程序所在的目录,而且链接所在的目录,所以在它的上一级目录中根本找不到skin目录,所以就需要获取程序的绝对路径,用到了一个函数readlink,原型如下:

1
2
3
#include <unistd.h>
 
ssize_t readlink(const char *restrict path , char *restrict buf , size_t bufsize);

该函数的作用是读取符号链接的原路径,将它存到buf中,返回添充到buf中的字节数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <unistd.h>
#include <stdio.h>
 
int main(int argc , char* argv[])
{
	char buf[1024] = { 0 };
	int n;
 
	n = readlink("/bin/mail" , buf , sizeof(buf));
	if( n > 0 && n < sizeof(buf))
	{
		printf("%s\n" , buf);
	}
}

程序运行后输出:/usr/bin/mailx

linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <unistd.h>
#include <stdio.h>
 
int main(int argc , char* argv[])
{
	char buf[1024] = { 0 };
	int n;
 
	n = readlink("/proc/self/exe" , buf , sizeof(buf));
	if( n > 0 && n < sizeof(buf))
	{
		printf("%s\n" , buf);
	}
}
1
2
ouclwp@darkstar:~/socket$ ./read 
/home/ouclwp/socket/read

分类: C/C++ 标签: ,

Slackware安装配置

一月 30th, {2010 2 条评论 4,354 人阅读过  

前两天实验室新买了一台服务器,装系统的活就交给了我,一直钟爱于Slackware,于是就想着把服务器上也装一个Slackware,因为是台裸机,没办法就去买了张CD,刻了张Slackware13.0CD1,服务器也不需要图形界面之类的东西,一张CD就完全足够了,然后借了个USB光驱就开始安装了。
1.Slackware安装

第一次用CD安装,过程很顺利,其实也没有什么特别需要说的,就是按照提示一步一步来的,第一步是分区,服务器是1T 的硬盘,这么大的硬盘我还真不知道该怎么分区,留了200G以后以防以后需要装Windows,可能性极小,但还是留了。

我的分区方案是:

swap分区 4G
ext3 40G 挂载在/ 用于存放操作系统
ext3 10G 挂载在/tmp 临时目录,10G着实有点大,不过硬盘空间也实在是用不完
ext3 700G 挂载在/home 把剩下的磁盘空间全给了/home,这样每个人开一个账户,在上面怎么折腾都行
ntfs 200G 挂载在/winback 为将来的windows预留的,十有八九是用不到的

接下来的硬盘安装就很简单了,只不过没有Ubuntu等发行版那么好看的界面,安装起来也一样很方便,引导程序安装了Slackware默认的LILO

另外把我当时硬盘安装的过程也简单写一写:
下载了一个grub020p.zip,解压开后放到了C盘根目录下,然后修改boot.ini文件,在最后面加一句话:

C:\grldr="Start GRUB"

menu.lst改不改无所谓了,我是没改过,还是喜欢直接在grub下用C进入command提示符模式,自己输地几个命令。

然后把slackwarecd1,cd2解压到某分区根目录下,找到bzImage和initrd.img两个文件放到某目录下,注意一定要放在FAT32的分区下,貌似grub识别不了ntfs,没有fat32分区想要硬盘安装就麻烦了。

OK,重启之后就可以进入grub界面了,然后C键,输入下面命令:

grub>root (hd0 , 3)
grub>kernel /boot/bzImage
grub>initrd /boot/initrd.img
grub>setup

这样grub就把内核装进了内存,接下来的操作就跟光盘安装一样了,只不过在选择安装源的时候指定刚才解压的那两个CD的目录就可以了。

2.Slackware基本配置

实验室服务器配置就先暂时不说了,服务器暂时还没有特别的要求,既不做web服务器也不做ftp服务器,把ssh启了就可以了,sshd是默认启动的,所以装完之后我就懒得去管它了。

简单地说一下我自己的机器上的配置吧。slackware安装完成之后默认没有进入图形界面,可用命令startx进行图形界面,前提是安装了图形界面,slackware的六张cd里面,第一张是系统核心的东西,必须安装的,第二张里面有xfce4,第三张里有kde,我没装,剩下的三张没下下来,也不知道有什么,不过前两张cd就完全够用了。

slackware默认的运行级别是3,可以在修改/etc/inittab文件,将启动级别修改为4,则会自动进入图开界面。

ouclwp@darkstar:~$ sudo vi /etc/inittab
# Default runlevel. (Do not set to 0 or 6)
id:3:initdefault:
#将这句话中的3改成4就可以了,各级别的作用如下:
# These are the default runlevels in Slackware:
#   0 = halt
#   1 = single user mode
#   2 = unused (but configured the same as runlevel 3)
#   3 = multiuser mode (default Slackware runlevel)
#   4 = X11 with KDM/GDM/XDM (session managers)
#   5 = unused (but configured the same as runlevel 3)
#   6 = reboot

其实rc.4这个脚本所做的唯一工作是启动了X11 Session Manager,先检测gdm,然后是kdm,都找不到就启动xdm,如果不安装gnome和kde的话就会用xdm启动,xdm是很难看的,我安装了一个kdm,后来用着不爽,最后还是换成了gdm。

我在将kde换成gdm的时候出了一个问题,当时gdm没装好,而kdm已经被我删了,这时候运行级别4和startx都进不了xfce4图形界面,查看了一下/etc/X11/xinit里面的文件,发现xinitrc这个符号链接变成了红色,这也就意味着这个链接的源不见了,查看了一下确实是,它居然是链到xinitrc.kde的,这是我怎么也不能理解的,kde环境连同kdm一起早就被我给删了,xinitrc.kde也不在了,而且我也从来没用过kde,startx就是执行了xinitrc这上脚本,所以就会出问题,我把xinitrc重新连接到了xinitrc.xfce上就没问题了。

编码格式

编码格式刚开始是用的GBK,后来发现用GBK有诸多不便,从网络上读取数据的时候大多数的服务器软件都是用的UTF-8编码,取下来的数据都要通过程转换成GBK,非常麻烦,于是终于鼓起勇气把编码格式转换成了UTF-8。

ouclwp@darkstar:sudo vi /etc/profile.d/lang.sh
#修改下面两句话
export LANG=zh_CN #将系统汉化
export LC_CTYPE=zh_CN.UTF-8  #使用UTF-8做为编码格式

这样修改就可以了,当然从GBK迁移到UTF-8还要做很多修改,最麻烦的就是中文文件名乱码,可以写个脚本全部修改过来的,不过后来看看觉得也不多,就懒得写了,用下面的命令修改:

ouclwp@darkstar:convmv -f gbk -t utf8 --notest *

另外还有一些软件像gftp都要修改的,就不一一写出来了,gftp我已经不再用了,FileZilla我个人觉得是一款极为出色的FTP客户端软件,强烈推荐。

音乐播放器我用的是mocp(music on console),一个纯命令行的音乐播放器,非常漂亮。

中文字体我用的是Vera Sans YuanTi ,下载下来之后放到/usr/share/fonts里面,然后更新一下字体缓存就可以了

ouclwp@darkstar:/usr/share/fonts$ fc-cache -fv

其它的都没有什么值得说的了。个人觉得slackware是一个出色的发行版,而且特别适合做开发,它集成了很多常用的开发包,像libxml2,libpng,openssl等等,用起来非常方便。slackware虽然没有apt或者yum这样在线的包管理工具,但slackware的pkg包管理工具一样很出色,而且在slackbuild.org上可以下载到绝大多数常用的包,强烈推荐每一个coder或者developer使用slackware,它给我最直接的感觉就是简洁,高效,稳定。

分类: Linux 标签: ,