centos mv意思?mv在医学是什么意思
大家好,今天来为大家解答centos mv意思这个问题的一些问题点,包括mv在医学是什么意思也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
centos system em1和em2什么区别什么意思
在centos6.4之前,如果6.2,6.3安装后网卡名称都是em开始,如果想用eth0这种名称,或者是自定义名称,可以参照以下来实施。
第一步:修改/boot/grub/grub.conf
增加一个 biosdevname=0的启动参数
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS(2.6.32-220.el6.x86_64)
root(hd0,0)
kernel/boot/vmlinuz-2.6.32-220.el6.x86_64 ro root=UUID=6e7bf859-80f1-4875-8e8a-6f0fbdc9c90d nomodeset rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD quiet rhgb crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM biosdevname=0
initrd/boot/initramfs-2.6.32-220.el6.x86_64.img
第二步:修改当前网卡配置文件的名称
mv ifcfg-em1 ifcfg-eth0
mv ifcfg-em2 ifcfg-eth1
第三步:修改网卡配置文件内容,把em1全部修改改为eth0
[root@xingfujie~]# cat/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
IPADDR=XXXXX
PREFIX=24
GATEWAY=XXXXX
DNS1=XXXXX
DEFROUTE=yes
UUID=XXXXXX
HWADDR=XXXXXX
全部修改完毕后,reboot从起电脑即可。
CentOS6.5基本操作常用命令详解
在你准备使用Linux系统作为网站服务器系统之前,我建议大家先学习一些基本的Linux系统的操作命令,这些命令都是在日常操作中和配置Linux服务器网络环境时要用到的,了解和掌握这些命令,将有助于你更好的使用Linux服务器。本文将以CentOS 6.5为例简单讲解一下Linux系统下常用的基本操作命令。
首先大家可以使用virtualbox安装一个CENTOS6.5系统,或者直接购买一个安装了centos系统的云主机,国内推荐阿里云,橙云主机其实也不错,不过我个人在使用过程中感觉速度不是很理想,特别是磁盘性能方面。国外的大家根据实际情况选择吧,我这里就不推荐了,免得被说是广告。
登录服务器实现远程控制
windows用户推荐使用Xshell(下载地址)
mac用户可以使用系统终端工具
登录服务器之后就可以开始命令行操作了
查看你当前所在的位置 pwd( print working directory)
pwd
会显示当前的位置,例如:
/root
改变你所在的目录位置 cd( change directory)
cd/home
会让你进入到根目录下面的 home这个目录里面,/表示根目录,如果用 pwd查看一下会返回:
/home
另外cd/root= cd~
列出目录里的东西 ls
ls
ls命令应该是 list的简称,列出的意思,这个命令可以配合一些参数,例如:
ls-la
这样会使用更详细的形式列出文件与目录,并且会包含目录里面隐藏的文件,l表示 long,a表示 all。在命令的后面你可以指定具体要列出的目录,例如:
ls-la/usr/local
这会列出在系统根目录下面的 usr目录下面的 local这个目录里的所有的东西。如果想查看命令详细的使用说明,可以加上 help参数:
ls--help
现在,你已经学会了一个简单的 ls命令去列出目录里的东西,在使用其它命令的时候,你也可以这样来用,你知道命令的后面可以添加一些参数,去做更具体的事情,想得到命令的使用说明,就去在命令后面添加一个 help参数,命令的后面也可以添加更具体的信息,比如一个目录的位置,一个文件的名称等等。
创建目录 mkdir( make directory)
mkdir
下面,我们可以在你当前所在的位置去创建一个新的目录,记得使用 pwd命令确定一下你的位置:
mkdir www
上面这行命令会在当前位置上去创建一个叫 www的目录。使用 ls命令,可以查看一下当前目录里面的东西。在安装WDCP时,我们要在根目录下创建一个WWW目录来挂载数据盘,使用的命令应该是
mkdir/www
删除目录或文件 rm( remove)
rm
在命令的后面,加上你想要删除的东西,可能是一个目录的名称,或者一个文件的名称。注意想要删除目录的时候,你需要添加两个参数:-r-f,可以将两个参数系在一起,如-rf
rm-rf www
这里,r参数可以让 rm命令递归删除目录及其内容,f参数是 force,表示强制删除。合起来这行命令的意思是,递归的强制删除 www这个目录,以及这个目录里面的所有的东西。
编辑文件 vi:
vi hello.txt
上面的命令会去编辑当前目录下面的 hello.txt这个文件,如果这个文件不存在,会打开一个空白的文件,这样你在保存并退出以后,就可以创建一个叫做 hello.txt的文件。vi工具的使用需要配合一些按键,比如打开文件以后,你想编辑这个文件,可以进入到编辑模式,按一下键盘上的 i键或者insert键,然后用上下左右按键去浏览到文件的某个位置上。编辑好以后,要按一下 esc键,退出编辑模式,然后输入:(冒号),再输入 wq,表示保存并退出。如果你不想保存所做的修改,可以输入: q。有的时候,在编辑一些只读文件,你需要再添加一个!,比如:wq!,或者 q!。
i,输入编辑模式。
esc,退出模式。
:wq,保存文件并退出。
:wq!,强制保存并退出。
:q,直接退出不保存修改。
/,可以进行搜索,在/后面加上要搜索的文字,然后回车。
n,可以查找下一处。
N,可以查找上一处。
ctrl+f,向后翻页。
ctrl+b,向前翻页。
详细的使用说明,可以查看 vi命令的帮助,vi help。
移动/重命名目录或文件 mv( move)
移动或重命名目录或者文件,使用的是同一个命令:
mv要移动的目录/文件移动之后的目录/文件
在这个后面先指一定想要移动的目录或者文件的位置,一个空格,后面再加上移动以后的目录和文件所在的位置。这里我们得先理解一下几个路径的意思:
/
表示系统的根目录。
~
表示当前所登录的用户的主目录。
.
一个点表示当前的目录。
../
两个点加一个斜线,表示上一级目录。
../../
表示上两级目录。知道了这些,我们就可以去移动目录或文件了。
mv www www1
上面这行命令的意思是,把当前目录里面的 www这个目录重命名为 www1。
mv www1../
这样会把 www1这个目录移动到当前目录的上一级目录下面,你可以进入到当前目录的上一级目录:
cd../
然后列出目录里面的东西:
ls
看到 www1目录了吗?删除它可以使用 rm命令加上 rf参数:
rm-rf www1
再用 ls看一下,是不是 www1已经不在了。
*号表示所有的文件或目录,比如你想把某个目录下面的所有的目录或文件移动到某个地方,可以这样:
mv/home/www/web1/*/home/www/gb1982
上面命令会把/home/www/web1里面的东西全部都移动到/home/www/gb1982这个目录里面。
复制目录或文件 cp( copy)
cp要复制的东西要复制到哪里
比如你当前目录下面有一个 hello.txt文件,你想复制一份,复制以后的文件叫 hello.bak,可以这样:
cp hello.txt hello.bak
你想把 hello.bak复制到某个目录的下面:
cp hello.bak/home/bak
这样会把 hello.bak这个文件复制到/home/bak里面,注意,bak这个目录必须已经存在了。
复制目录,你需要添加一个-R的参数,它会递归的去复制目录以及目录里面的所有的东西。比如要把 www这个目录复制一份,复制以后的目录名是 www1:
cp-R www www1
CentOS下共享内存使用的常见陷阱详解
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃。
超过共享内存的大小限制?
在一个linux服务器上,共享内存的总体大小是有限制的,这个大小通过SHMMAX参数来定义(以字节为单位),您可以通过执行以下命令来确定 SHMMAX的值:
# cat/proc/sys/kernel/shmmax
如果机器上创建的共享内存的总共大小超出了这个限制,在程序中使用标准错误perror可能会出现以下的信息:
unable to attach to shared memory
解决方法:
1、设置 SHMMAX
SHMMAX的默认值是 32MB。一般使用下列方法之一种将 SHMMAX参数设为 2GB:
通过直接更改/proc文件系统,你不需重新启动机器就可以改变 SHMMAX的默认设置。我使用的方法是将以下命令放入/>etc/rc.local启动文件中:
# echo"2147483648">/proc/sys/kernel/shmmax
您还可以使用 sysctl命令来更改 SHMMAX的值:
# sysctl-w kernel.shmmax=2147483648
最后,通过将该内核参数插入到/etc/sysctl.conf启动文件中,您可以使这种更改永久有效:
# echo"kernel.shmmax=2147483648">>/etc/sysctl.conf
2、设置 SHMMNI
我们现在来看 SHMMNI参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096。这一数值已经足够,通常不需要更改。
您可以通过执行以下命令来确定 SHMMNI的值:
# cat/proc/sys/kernel/shmmni
4096
3、设置 SHMALL
最后,我们来看 SHMALL共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL的默认大小为 2097152,可以使用以下命令进行查询:
# cat/proc/sys/kernel/shmall
2097152
SHMALL的默认设置对于我们来说应该足够使用。
注意:在 i386平台上 Red Hat Linux的页面大小为 4096字节。但是,您可以使用 bigpages,它支持配置更大的内存页面尺寸。
多次进行shmat会出现什么问题?
当首次创建共享内存段时,它并不能被任何进程所访问。为了使共享内存区可以被访问,则必须通过 shmat函数将其附加( attach)到自己的进程空间中,这样进程就与共享内存建立了连接。该函数声明在 linux/shm.h中:
#include
#include
void*shmat(int shmid, const void*shmaddr, int shmflg);
参数 shmid是 shmget()的返回值,是个标识符;
参数 shmflg是存取权限标志;如果为 0,则不设置任何限制权限。在中定义了几个权限:
#define SHM_RDONLY 010000/* attach read-only else read-write*/
#define SHM_RND 020000/* round attach address to SHMLBA*/
#define SHM_REMAP 040000/* take-over region on attach*/
如果指定 SHM_RDONLY,那么共享内存区只有读取权限。
参数 shmaddr是共享内存的附加点,不同的取值有不同的含义:
?如果为空,则由内核选择一个空闲的内存区;如果非空,返回地址取决于调用者是否给 shmflg参数指定 SHM_RND值,如果没有指定,则共享内存区附加到由 shmaddr指定的地址;否则附加地址为 shmaddr向下舍入一个共享内存低端边界地址后的地址(SHMLBA,一个常址)。
Ø通常将参数 shmaddr设置为 NULL。
shmat()调用成功后返回一个指向共享内存区的指针,使用该指针就可以访问共享内存区了,如果失败则返回-1。
其映射关系如下图所示:
图1.1共享内存映射图
其中,shmaddr表示的是物理内存空间映射到进程的虚拟内存空间时候,虚拟内存空间中该块内存的起始地址,在使用中,因为我们一般不清楚进程中哪些地址没有被占用,所以不好指定物理空间的内存要映射到本进程的虚拟内存地址,一般会让内核自己指定:
void ptr= shmat(shmid, NULL,0);
这样挂载一个共享内存如果是一次调用是没有问题的,但是一个进程是可以对同一个共享内存多次 shmat进行挂载的,物理内存是指向同一块,如果shmaddr为NULL,则每次返回的线性地址空间都不同。而且指向这块共享内存的引用计数会增加。也就是进程多块线性空间会指向同一块物理地址。这样,如果之前挂载过这块共享内存的进程的线性地址没有被shmdt掉,即申请的线性地址都没有释放,就会一直消耗进程的虚拟内存空间,很有可能会最后导致进程线性空间被使用完而导致下次shmat或者其他操作失败。
解决方法:
可以通过判断需要申请的共享内存指针是否为空来标识是否是第一次挂载共享内存,若是则使用进行挂载,若不是则退出。
void* ptr= NULL;
...
if(NULL!= ptr)
return;
ptr= shmat(shmid,ptr,0666);
附:
函数shmat将标识号为shmid共享内存映射到调用进程的地址空间中,映射的地址由参数shmaddr和shmflg共同确定,其准则为:
(1)如果参数shmaddr取值为NULL,系统将自动确定共享内存链接到进程空间的首地址。
(2)如果参数shmaddr取值不为NULL且参数shmflg没有指定SHM_RND标志,系统将运用地址shmaddr链接共享内存。
(3)如果参数shmaddr取值不为NULL且参数shmflg指定了SHM_RND标志位,系统将地址shmaddr对齐后链接共享内存。其中选项SHM_RND的意思是取整对齐,常数SHMLBA代表了低边界地址的倍数,公式“shmaddr–(shmaddr% SHMLBA)”的意思是将地址shmaddr移动到低边界地址的整数倍上。
Shmget创建共享内存,当key相同时,什么情况下会出错?
shmget()用来创建一个共享内存区,或者访问一个已存在的共享内存区。该函数定义在头文件 linux/shm.h中,原型如下:
#include
#include
int shmget(key_t key, size_t size, int shmflg);
参数 key是由 ftok()得到的键值;
参数 size是以字节为单位指定内存的大小;
参数 shmflg是操作标志位,它的一些宏定义如下:
IPC_CREATE:调用 shmget时,系统将此值与其他共享内存区的 key进行比较,如果存在相同的 key,说明共享内存区已存在,此时返回该共享内存区的标识符,否则新建一个共享内存区并返回其标识符。
IPC_EXCL:该宏必须和 IPC_CREATE一起使用,否则没意义。当 shmflg取 IPC_CREATE| IPC_EXCL时,表示如果发现内存区已经存在则返回-1,错误代码为 EEXIST。
注意,当创建一个新的共享内存区时,size的值必须大于 0;如果是访问一个已经存在的内存共享区,则置 size为 0。
一般我们创建共享内存的时候会在一个进程中使用shmget来创建共享内存,
Int shmid= shmget(key, size, IPC_CREATE|0666);
而在另外的进程中,使用shmget和同样的key来获取到这个已经创建了的共享内存,
Int shmid= shmget(key, size, IPC_CREATE|0666);
如果创建进程和挂接进程key相同,而对应的size大小不同,是否会shmget失败?
Ø已经创建的共享内存的大小是可以调整的,但是已经创建的共享内存的大小只能调小,不能调大
如:
shm_id= shmget(key,4194304,IPC_CREAT);
创建了一个4M大小的共享内存,如果这个共享内存没有删掉,我们再使用
shm_id= shmget(key,10485760,IPC_CREAT);
来创建一个10M大小的共享内存的时候,使用标准错误输出会有如下错误信息:
shmget error: Invalid argument
但是,如果我们使用:
shm_id= shmget(key,3145728,IPC_CREAT);
来创建一个3M大小的共享内存的时候,并不会输出错误信息,只是共享内存大小会被修改为3145728,这也说明,使用共享内存的时候,是用key来作为共享内存的唯一标识的,共享内存的大小不能区分共享内存。
这样会导致什么问题?
当多个进程都能创建共享内存的时候,如果key出现相同的情况,并且一个进程需要创建的共享内存的大小要比另外一个进程要创建的共享内存小,共享内存大的进程先创建共享内存,共享内存小的进程后创建共享内存,小共享内存的进程就会获取到大的共享内存进程的共享内存,并修改其共享内存的大小和内容(留意下面的评论补充),从而可能导致大的共享内存进程崩溃。
解决方法:
方法一:
在所有的共享内存创建的时候,使用排他性创建,即使用IPC_EXCL标记:
Shmget(key, size,IPC_CREATE|IPC_EXCL);
在共享内存挂接的时候,先使用排他性创建判断共享内存是否已经创建,如果还没创建则进行出错处理,若已经创建,则挂接:
Shmid= Shmget(key, size,IPC_CREATE|IPC_EXCL);
If(-1!= shmid)
{
Printf("error");
}
Shmid= Shmget(key, size,IPC_CREATE);
方法二:
虽然都希望自己的程序能和其他的程序预先约定一个唯一的键值,但实际上并不是总可能的成行的,因为自己的程序无法为一块共享内存选择一个键值。因此,在此把key设为IPC_PRIVATE,这样,操作系统将忽略键,建立一个新的共享内存,指定一个键值,然后返回这块共享内存IPC标识符ID。而将这个新的共享内存的标识符ID告诉其他进程可以在建立共享内存后通过派生子进程,或写入文件或管道来实现,即这种方法不使用key来创建共享内存,由操作系统来保证唯一性。
ftok是否一定会产生唯一的key值?
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_t ftok( char* pathname, int proj_id)
pathname就时你指定的文件名,proj_id是子序号。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为0×010002,而你指定的proj_id值为38,换算成16进制为0×26,则最后的key_t返回值为0×26010002。
查询文件索引节点号的方法是: ls-i
但当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分配,因此与原来不同,所以得到的索引节点号也不同。
根据pathname指定的文件(或目录)名称,以及proj_id参数指定的数字,ftok函数为IPC对象生成一个唯一性的键值。在实际应用中,很容易产生的一个理解是,在proj_id相同的情况下,只要文件(或目录)名称不变,就可以确保ftok返回始终一致的键值。然而,这个理解并非完全正确,有可能给应用开发埋下很隐晦的陷阱。因为ftok的实现存在这样的风险,即在访问同一共享内存的多个进程先后调用ftok函数的时间段中,如果pathname指定的文件(或目录)被删除且重新创建,则文件系统会赋予这个同名文件(或目录)新的i节点信息,于是这些进程所调用的ftok虽然都能正常返回,但得到的键值却并不能保证相同。由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目的将无法实现。
所以如果要确保key_t值不变,要么确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值。
如果存在生成key_t值的文件被删除过,则很有可能自己现在使用的共享内存key_t值会和另外一个进程的key_t值冲突,如下面这种情况:
进程1使用文件1来ftok生成了key10000,进程2使用文件2来ftok生成了key 11111,此时如果进程1和进程2都需要下载文件,并将文件的内容更新到共享内存,此时进程1和2都需要先下文件,再删掉之前的共享内存,再使用ftok生成新的key,再用这个key去申请新的共享内存来装载新的问题,但是可能文件2比较大,下载慢,而文件1比较小,下载比较慢,由于文件1和文件2都被修改,此时文件1所占用的文件节点号可能是文件2之前所占用的,此时如果下载的文件1的ftok生成的key为11111的话,就会和此时还没有是否11111这个key的进程2的共享内存冲突,导致出现问题。
解决方法:
方法一:
在有下载文件操作的程序中,对下载的文件使用ftok获取key的时候,需要进行冲突避免的措施,如使用独占的方式获取共享内存,如果不成功,则对key进行加一操作,再进行获取共享内存,一直到不会产生冲突为止。
方法二:
下载文件之前,将之前的文件进行mv一下,先“占”着这个文件节点号,防止其他共享内存申请key的时候获取到。
另外:
创建进程在通知其他进程挂接的时候,建议不使用ftok方式来获取Key,而使用文件或者进程间通信的方式告知。
共享内存删除的陷阱?
当进程结束使用共享内存区时,要通过函数 shmdt断开与共享内存区的连接。该函数声明在 sys/shm.h中,其原型如下:
#include
#include
int shmdt(const void*shmaddr);
参数 shmaddr是 shmat函数的返回值。
进程脱离共享内存区后,数据结构 shmid_ds中的 shm_nattch就会减 1。但是共享段内存依然存在,只有 shm_attch为 0后,即没有任何进程再使用该共享内存区,共享内存区才在内核中被删除。一般来说,当一个进程终止时,它所附加的共享内存区都会自动脱离。
我们通过:
int shmctl( int shmid, int cmd, struct shmid_ds*buf);
来删除已经存在的共享内存。
第一个参数,shmid,是由shmget所返回的标记符。
第二个参数,cmd,是要执行的动作。他可以有三个值:
命令描述
IPC_STAT设置shmid_ds结构中的数据反射与共享内存相关联的值。
IPC_SET如果进程有相应的权限,将与共享内存相关联的值设置为shmid_ds数据结构中所提供的值。
IPC_RMID删除共享内存段。
第三个参数,buf,是一个指向包含共享内存模式与权限的结构的指针,删除的时候可以默认为0。
如果共享内存已经与所有访问它的进程断开了连接,则调用IPC_RMID子命令后,系统将立即删除共享内存的标识符,并删除该共享内存区,以及所有相关的数据结构;
如果仍有别的进程与该共享内存保持连接,则调用IPC_RMID子命令后,该共享内存并不会被立即从系统中删除,而是被设置为IPC_PRIVATE状态,并被标记为”已被删除”(使用ipcs命令可以看到dest字段);直到已有连接全部断开,该共享内存才会最终从系统中消失。
需要说明的是:一旦通过shmctl对共享内存进行了删除操作,则该共享内存将不能再接受任何新的连接,即使它依然存在于系统中!所以,可以确知,在对共享内存删除之后不可能再有新的连接,则执行删除操作是安全的;否则,在删除操作之后如仍有新的连接发生,则这些连接都将可能失败!
Shmdt和shmctl的区别:
Shmdt是将共享内存从进程空间detach出来,使进程中的shmid无效化,不可以使用。但是保留空间。
而shmctl(sid,IPC_RMID,0)则是删除共享内存,彻底不可用,释放空间。