0%

CentOS 问题集锦

rpm相关

rpm删除出现”error: %preun( ) scriptlet failed, exit status 1解决方法

今天删除软件的时候报了下面的这个错误:
错误提示是:error: %preun(xxxxxx) scriptlet failed, exit status 1

最后在网上找到一个办法,就是加 –noscripts 标记来删除RPM。 –noscripts 相当于 -nopre -nopost -nopreun -nopostun。
即卸载命令变为:

1
$rpm -e –noscripts xxxxxx

若要查看与RPM关联的scripts,使用-script查询RPM包。

1
$rpm -q -scripts package

卸载时,若系统里有同一程序的多个安装版本要一起删除,可使用-allmatches标记,如

1
$ rpm -e –noscripts -allmatches xxxxxx

Ubuntu 问题集锦

perl: warning: Setting locale failed

有时apt-get install的时候,会出现下面的错误:

1
2
3
4
5
6
7
8
9
10
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = “en_US:en”,
LC_ALL = (unset),
LC_CTYPE = “en_US.UTF-8”,
LC_COLLATE = “en_US.UTF-8”,
LC_MESSAGES = “en_US.UTF-8”,
LANG = “en_US”
are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).

解决方法上面也有了提示就是:Falling back to the standard locale。
所以解决办法是::

vi /root/.bashrc

在最底部添加上一句

export LC_ALL=C

或者直接运行

#echo “export LC_ALL=C” >> /root/.bashrc

然后执行一下:

source /root/.bashrc

其中LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行

修改ubuntu命令行语言环境

ubuntu 安装时候选择的是中文环境,但是其实中文支持不是很完全,在使用ssh连接上后发现一些中文在securecrt中显示是乱码,所以还是改回英文方便点

修改Ubuntu的命令行语言环境的2个步骤:

1、修改/etc/default/locale

如不存在则新建一个

如下:

1
2
3
LANG=’en_US’ #中文可以用zh_CN

LANGUAGE=’en_US:en’ #中文可以用zh_CN:zh

2、reboot即可

locale命令可以列出当前系统所用的所有语言设置

开始erlang

在终端中输入erl,即可看到如下所示:

1
2
3
4
$ erl
Erlang R14B (erts-5.8.1.1) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]
Eshell V5.8.1.1 (abort with ^G)
1>

其中 “>” 表示系统正等待输入。将Erlang当做一个计算器:

1
2
3
1> 2*6.
12
2>

切记,每个表达式** 使用一个句点.** 来结束。
编辑以前的表达式

可以使用类似emacs行编辑命令来取回以前的表达式进行编辑。最常用的命令为:

1
2
3
4
5
6
7
8
9
^P 获取前一行
^N 获取下一行
^A 移至当前行首
^E 移至当前行尾
^D 删除当前光标下字符
^F 前移一个字符
^B 后退一个字符
Return 执行命令

注: ^X 表示Control + X

赶紧使用Control+P看看结果吧。
编译你的第一个程序

使用你最爱的编辑器输入下列内容:

1
2
3
4
5
6
-module(test).
-export([fac/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).

保存为 test.erl ,注意文件名必须和模块名相同。

通过输入c(test) 来编译该程序然后运行它:

1
2
3
4
5
6
7
3> c(test).
{ok,test}
30> test:fac(20).
2432902008176640000
4> test:fac(40).
815915283247897734345611269596115894272000000000
32>

Linux 的 Hostname命令

正常情况下,系统启动的时候我们就会设置hostname

不过大部分哥们在安装的时候估计不会特别在意。不过如果在管理或者登录的计算机比较多的情况下,设置主机名就是一件特别需要留意的事情了。

至少在设置了主机名后你就会知道ssh登录的是那台系统。

官方定义为:

hostname - show or set the system’s host name

hostname命令用于显示和设置系统的主机名称。环境变量HOSTNAME 或者 HOST 保存了当前的主机名。

使用方法为:

1
$ hostname [-b|--boot] [-F|--file filename] [hostname]

基本的使用为查看和修改。

临时更改运行系统的主机名

系统如果正在运行,可以直接使用hostname来临时更改主机名,在系统重启前,都会保证有效。

命令如下:

1
$ hostname NEW_HOSTNAME

注意这个命令话系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。

永久更改主机名

这里分为两种情况,主要为基于两种不同的主流发行版,需要修改文件,需要管理员权限。

Debian系列

基于Debian系统的设置在文件/etc/hostname,系统启动时会读取该文件并调用初始化脚本/etc/init.d/hostname.sh

所以对于这类系统可以通过修改编辑文件/etc/hostname来更改。

1
/etc/init.d/hostname.sh start

修改完毕后,这个命令可以立即更改。

Redhat系列

基于RedHat的系统使用文件 /etc/sysconfig/network来设置。可以通过修改该文件并使用hostname命令来设置。

还有其他的方法,你知道吗?

Linux 的 Hostname命令

正常情况下,系统启动的时候我们就会设置hostname

不过大部分哥们在安装的时候估计不会特别在意。不过如果在管理或者登录的计算机比较多的情况下,设置主机名就是一件特别需要留意的事情了。

至少在设置了主机名后你就会知道ssh登录的是那台系统。

官方定义为:

hostname - show or set the system’s host name

hostname命令用于显示和设置系统的主机名称。环境变量HOSTNAME 或者 HOST 保存了当前的主机名。

使用方法为:

1
$ hostname [-b|--boot] [-F|--file filename] [hostname]

基本的使用为查看和修改。

临时更改运行系统的主机名

系统如果正在运行,可以直接使用hostname来临时更改主机名,在系统重启前,都会保证有效。

命令如下:

1
$ hostname NEW_HOSTNAME

注意这个命令话系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。

永久更改主机名

这里分为两种情况,主要为基于两种不同的主流发行版,需要修改文件,需要管理员权限。

Debian系列

基于Debian系统的设置在文件/etc/hostname,系统启动时会读取该文件并调用初始化脚本/etc/init.d/hostname.sh

所以对于这类系统可以通过修改编辑文件/etc/hostname来更改。

1
/etc/init.d/hostname.sh start

修改完毕后,这个命令可以立即更改。

Redhat系列

基于RedHat的系统使用文件 /etc/sysconfig/network来设置。可以通过修改该文件并使用hostname命令来设置。

还有其他的方法,你知道吗?

问题

github上有个功能叫fork,可以将别人的工程复制到自己账号下。
这个功能很方便,但其有一个缺点是:当源项目更新后,你fork的分支并不会一起更新,需要自己手动去更新。

方法

这个需要在命令行里面操作了。

  1. clone 自己账号里fork的分支

    1
    2
    git clone https://github.com/user/test.git
    cd sql-parser
  2. 查看远程原始分支(可以用 git remote -v 命令查看远程分支列表)

    1
    2
    3
    $ git remote -v
    origin https://github.com/user/test.git (fetch)
    origin https://github.com/user/test.git (push)
  3. 如果没有远程原始分支则需要增加:

    1
    git remote add upstream https://github.com/another/test.git
  4. 查看确认远程分支列表:

    1
    2
    3
    4
    5
    git remote -v
    origin https://github.com/user/test.git (fetch)
    origin https://github.com/user/test.git (push)
    upstream https://github.com/another/test.git (fetch)
    upstream https://github.com/another/test.git (push)
  5. fetch原始源分支的新版本到本地
    git fetch upstream

  6. 合并两个版本的代码

    git merge upstream/master

  7. 把最新的代码提交到github自己(user)的账号上

    git push origin master

atan函数与atan2函数的一点区别

atan 和 atan2 都是求反正切函数,如:有两个点 point(x1,y1), 和 point(x2,y2);

那么这两个点形成的斜率的角度计算方法分别是:

1
float angle = atan( (y2-y1)/(x2-x1) );

1
float angle = atan2( y2-y1, x2-x1 );

atan 和 atan2 区别:

1:参数的填写方式不同;

2:atan2 的优点在于 如果 x2-x1等于0 依然可以计算,但是atan函数就会导致程序出错;

结论: atan 和 atan2函数,建议用 atan2函数.

删除Linux多余内核

还记得曾经一度有个牛人,几百个大大的linux启动项列表,据说从头到尾看一遍就需要10几分钟,哥有洁癖,内核升级完后,如果使用稳定,过个几天就会清理掉(因为有时在安装新系统的时候可能boot分的不是很大,在update的时候,老是提示说boot分区大小不够,清理掉就瞬间OK了),不过最近的grub做的比较人性了,以前都是满屏的内核版本,现在除了最新的,其他的都放在一个Previous Linux Version了,就像微信里面的公众号放到一个文件夹里面,世界瞬间安静了很多。

Debian系列–适用于Ubuntu、LinuxMint等

第一种方法

找出系统已经安装的内核版本,在终端里输入命令:

1
dpkgget-selections | grep linux-image

然后会显示系统中已安装的内核.

卸载旧的内核版本,在终端里输入命令:

1
sudo apt-get remove linux-image-***

注意不要把最新的内核给删除掉哟,我没有测试过,不知道会出现嘛情况,你可以手一哆嗦小试一下撒。

删除内核后,运行下属命令,直接重启也可以。

1
update-grub

第二种方法

在图像界面下,可以使用新立得软件包管理器删除

  1. 点菜单“系统-系统管理-新立得软件包管理器”;
  2. 以2.6.32-21版本的内核为例,内核文件里包括:linux-headers-2.6.32-21、linux-headers- 2.6.32-21-generic、linux-image-2.6.32-21-generic、linux-restricted-modules-2.6.32-21-generic、linux-ubuntu-modules-2.6.32-21-generic;
  3. 在新立得中,点工具栏上的“搜索”按钮,在出来的搜索框中输入 linux 2.6.32-21 ,注意linux后面有一个空格

Redhat系列–适用于CentOS、Fedora等

第一种方法

首先列出系统中正在使用的内核:

1
# uname -a

查询系统中全部的内核:

1
# rpm -qa | grep kernel

将你想删除的内核删除掉🙁例如,在我的系统中,我要删掉kernel-2.6.32-279.9.1.el6.x86_64的内核,需要把所有含有kernel-2.6.32-279.9.1.el6.x86_64字样的全部删掉)

1
#yum remove kernel-2.6.32-279.9.1.el6.x86_64

重启后就可以看到,内核被删掉了,同时多余的启动项也自动被删掉了。

第二种方法

手动修改/boot/grub/menu.lst 把多余的项删除,但是这个指标不治本哟。

第三种方法 – 力荐

查看已经安装的内核命令:

1
rpm -q kernel

删除旧的内核

安装yum-utls:

1
sudo install yum-utils

设置你想要保留多少旧的内核,比如我想保留两个:

1
sudo package-cleanup –oldkernels –count=2

设置永久的内核安装数量,我设置的是两个

1
2
3
sudo gedit /etc/yum.conf
#设置
installonly_limit=2

重启,就只会看见两个内核启动项了。

第四种方法

删除除当前内核外的其他所有内核,一条命令即可解决:

1
yum remove kernel

recv/recvfrom/recvmsg系统调用

功能描述:

从套接字上接收一个消息。对于recvfrom 和 recvmsg,可同时应用于面向连接的和无连接的套接字。recv一般只用在面向连接的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。
假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。

用法:

1
2
3
4
5
6
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sock, void *buf, size_t len, int flags);
ssize_t recvfrom(int sock, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
ssize_t recvmsg(int sock, struct msghdr *msg, int flags);

参数:
sock:索引将要从其接收数据的套接字。
buf:存放消息接收后的缓冲区。
len:buf所指缓冲区的容量。
flags:是以下一个或者多个标志的组合体,可通过or操作连在一起
MSG_DONTWAIT:操作不会被阻塞。
MSG_ERRQUEUE: 指示应该从套接字的错误队列上接收错误值,依据不同的协议,错误值以某种辅佐性消息的方式传递进来, 使用者应该提供足够大的缓冲区。导致错误的原封包通过msg_iovec作为一般的数据来传递。导致错误的数据报原目标地址作为msg_name被提供。 错误以sock_extended_err结构形态被使用,定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define SO_EE_ORIGIN_NONE    0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err
{
u_int32_t ee_errno; /* error number */
u_int8_t ee_origin; /* where the error originated */
u_int8_t ee_type; /* type */
u_int8_t ee_code; /* code */
u_int8_t ee_pad;
u_int32_t ee_info; /* additional information */
u_int32_t ee_data; /* other data */
/* More data may follow */
};

MSG_PEEK:指示数据接收后,在接收队列中保留原数据,不将其删除,随后的读操作还可以接收相同的数据。
MSG_TRUNC:返回封包的实际长度,即使它比所提供的缓冲区更长, 只对packet套接字有效。
MSG_WAITALL:要求阻塞操作,直到请求得到完整的满足。然而,如果捕捉到信号,错误或者连接断开发生,或者下次被接收的数据类型不同,仍会返回少于请求量的数据。
MSG_EOR:指示记录的结束,返回的数据完成一个记录。
MSG_TRUNC:指明数据报尾部数据已被丢弃,因为它比所提供的缓冲区需要更多的空间。
MSG_CTRUNC:指明由于缓冲区空间不足,一些控制数据已被丢弃。
MSG_OOB:指示接收到out-of-band数据(即需要优先处理的数据)。
MSG_ERRQUEUE:指示除了来自套接字错误队列的错误外,没有接收到其它数据。
from:指向存放对端地址的区域,如果为NULL,不储存对端地址。
fromlen:作为入口参数,指向存放表示from最大容量的内存单元。作为出口参数,指向存放表示from实际长度的内存单元。
msg:指向存放进入消息头的内存缓冲,结构形态如下

1
2
3
4
5
6
7
8
9
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};

可能用到的数据结构有

1
2
3
4
5
6
7
struct cmsghdr {
socklen_t cmsg_len; /* data byte count, including hdr */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by
u_char cmsg_data[]; */
};

返回说明:
成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1,errno被设为以下的某个值
EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时
EBADF:sock不是有效的描述词
ECONNREFUSE:远程主机阻绝网络连接
EFAULT:内存空间访问出错
EINTR:操作被信号中断
EINVAL:参数无效
ENOMEM:内存不足
ENOTCONN:与面向连接关联的套接字尚未被连接上
ENOTSOCK:sock索引的不是套接字

c语言中如何判断文件是否存在

一般情况下,我们可以使用函数stat(), access() 和fopen()来检验文件是否存在,但是由于文件权限的问题,有时可能不像结果所言,可能不是因为文件不存在,而是没有打开的权限。

函数fopen

通常情况下使用fopen主要用于读写文件,而我们就可以在这个上面做文章,通过以只读r的模式打开,如果失败,就是文件不存在咯。

1
2
3
4
5
6
7
8
9
10
11
FILE *fp;

fp=fopen(“file.txt” , “r”);

if ( fp == NULL )

printf(“file not exist!”);

else

fcolse(fp);

也可以写个子函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//存在返回0,不存在返回1
int file_exist(FILE *fo)

{

if(fopen(fp)==NULL)

return 1;

else

return 0;

}

函数access

设计的子函数为:

1
2
3
4
int file_exists(char *filename)
{
return (access(filename, 0) == 0);
}

access(filename, 0)0 表示判断文件是否存在
finename 文件名称 ,mode 模式,共5种模式:

  • 0-检查文件是否存在
  • 1-检查文件是否可运行
  • 2-检查文件是否可写访问
  • 4-检查文件是否可读访问
  • 6-检查文件是否可读/写访问

注意,有的不适用数字表示,比如文件是否存在使用模式F_OK,类似的R_OK、W_OK和X_OK分别表示读写和可执行模式。

函数stat

stat函数可以获取文件的属性:

·表头文件: #include <sys/stat.h>

·函数定义: int stat(const char *file_name, struct stat *buf);

·函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中

·返回值: 执行成功则返回0,失败返回-1,错误代码存于errno(需要include <errno.h>)

因此如果文件存在,该函数将返回0,否则返回1。利用stat()函数来判断文件是否存在的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int cfileexists(const char* filename){

struct stat buffer;

int exist = stat(filename,&buffer);

if(exist == 0)

return 1;

else // -1

return 0;

}

函数lstat

与stat函数比较类似,除了在符号链接的时候有点小差别。

函数open

对比与fopen,我们也可以使用open来判断文件的存在与否。