Linux中直接IO机制的介绍

Linux中直接IO机制的介绍
Linux中直接IO机制的介绍

Linux 中直接 I/O 机制的介绍https://www.360docs.net/doc/1f7105881.html,/developerworks/cn/linux/l-cn-...

https://www.360docs.net/doc/1f7105881.html,/developerworks/cn/linux/l-cn-...

当应用程序需要直接访问文件而不经过操作系统页高速缓冲存储器的时候,它打开文件的时候需要指定 O_DIRECT 标识符。

操作系统内核中处理 open() 系统调用的内核函数是 sys_open(),sys_open() 会调用 do_sys_open() 去处理主要的打开操作。它主要做了三件事情:首先,它调用 getname() 从进程地址空间中读取文件的路径名;接着,do_sys_open() 调用

get_unused_fd() 从进程的文件表中找到一个空闲的文件表指针,相应的新文件描述符就存放在本地变量 fd 中;之后,函数

do_?lp_open() 会根据传入的参数去执行相应的打开操作。清单 1 列出了操作系统内核中处理 open() 系统调用的一个主要函数关系图。

清单 1. 主要调用函数关系图

sys_open()

|-----do_sys_open()

|---------getname()

|---------get_unused_fd()

|---------do_filp_open()

|--------nameidata_to_filp()

|----------__dentry_open()

函数 do_?ip_open() 在执行的过程中会调用函数 nameidata_to_?lp(),而 nameidata_to_?lp() 最终会调用 __dentry_open()函数,若进程指定了 O_DIRECT 标识符,则该函数会检查直接 I./O 操作是否可以作用于该文件。清单 2 列出了 __dentry_open()函数中与直接 I/O 操作相关的代码。

清单 2. 函数 dentry_open() 中与直接 I/O 相关的代码

if (f->f_flags & O_DIRECT) {

if (!f->f_mapping->a_ops ||

((!f->f_mapping->a_ops->direct_IO) &&

(!f->f_mapping->a_ops->get_xip_page))) {

fput(f);

f = ERR_PTR(-EINVAL);

}

}

当文件打开时指定了 O_DIRECT 标识符,那么操作系统就会知道接下来对文件的读或者写操作都是要使用直接 I/O 方式的。

下边我们来看一下当进程通过 read() 系统调用读取一个已经设置了 O_DIRECT 标识符的文件的时候,系统都做了哪些处理。函数read() 的原型如下所示:

ssize_t read(int feledes, void *buff, size_t nbytes) ;

操作系统中处理 read() 函数的入口函数是 sys_read(),其主要的调用函数关系图如下清单 3 所示:

清单 3. 主调用函数关系图

sys_read()

|-----vfs_read()

|----generic_file_read()

|----generic_file_aio_read()

|--------- generic_file_direct_IO()

函数 sys_read() 从进程中获取文件描述符以及文件当前的操作位置后会调用 vfs_read() 函数去执行具体的操作过程,而

vfs_read() 函数最终是调用了 ?le 结构中的相关操作去完成文件的读操作,即调用了 generic_?le_read() 函数,其代码如下所示:

清单 4. 函数 generic_?le_read()

ssize_t

generic_file_read(struct file *filp,

char __user *buf, size_t count, loff_t *ppos)

{

struct iovec local_iov = { .iov_base = buf, .iov_len = count };

struct kiocb kiocb;

ssize_t ret;

init_sync_kiocb(&kiocb, filp);

ret = __generic_file_aio_read(&kiocb, &local_iov, 1, ppos);

if (-EIOCBQUEUED == ret)

ret = wait_on_sync_kiocb(&kiocb);

return ret;

}

函数 generic_?le_read() 初始化了 iovec 以及 kiocb 描述符。描述符 iovec 主要是用于存放两个内容:用来接收所读取数据的用户地址空间缓冲区的地址和缓冲区的大小;描述符 kiocb 用来跟踪 I/O 操作的完成状态。之后,函数 generic_?le_read() 凋用函数 __generic_?le_aio_read()。该函数检查 iovec 中描述的用户地址空间缓冲区是否可用,接着检查访问模式,若访问模式描述符设置了 O_DIRECT,则执行与直接 I/O 相关的代码。函数 __generic_?le_aio_read() 中与直接 I/O 有关的代码如下所示:

清单 5. 函数 __generic_?le_aio_read() 中与直接 I/O 有关的代码

if (filp->f_flags & O_DIRECT) {

loff_t pos = *ppos, size;

struct address_space *mapping;

struct inode *inode;

mapping = filp->f_mapping;

inode = mapping->host;

retval = 0;

if (!count)

goto out;

size = i_size_read(inode);

if (pos < size) {

retval = generic_file_direct_IO(READ, iocb,

iov, pos, nr_segs);

if (retval > 0 && !is_sync_kiocb(iocb))

retval = -EIOCBQUEUED;

if (retval > 0)

*ppos = pos + retval;

}

file_accessed(filp);

goto out;

}

上边的代码段主要是检查了文件指针的值,文件的大小以及所请求读取的字节数目等,之后,该函数调用

generic_?le_direct_io(),并将操作类型 READ,描述符 iocb,描述符 iovec,当前文件指针的值以及在描述符 io_vec 中指定的用户地址空间缓冲区的个数等值作为参数传给它。当 generic_?le_direct_io() 函数执行完成,函数

__generic_?le_aio_read()会继续执行去完成后续操作:更新文件指针,设置访问文件 i 节点的时间戳;这些操作全部执行完成以后,函数返回。函数 generic_?le_direct_IO() 会用到五个参数,各参数的含义如下所示:

rw:操作类型,可以是 READ 或者 WRITE

iocb:指针,指向 kiocb 描述符 

iov:指针,指向 iovec 描述符数组

o?set:?le 结构偏移量

nr_segs:iov 数组中 iovec 的个数

函数 generic_file_direct_IO() 代码如下所示:

清单 6. 函数 generic_?le_direct_IO()

static ssize_t

generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,

loff_t offset, unsigned long nr_segs)

{

struct file *file = iocb->ki_filp;

struct address_space *mapping = file->f_mapping;

ssize_t retval;

size_t write_len = 0;

if (rw == WRITE) {

write_len = iov_length(iov, nr_segs);

if (mapping_mapped(mapping))

unmap_mapping_range(mapping, offset, write_len, 0);

}

retval = filemap_write_and_wait(mapping);

if (retval == 0) {

retval = mapping->a_ops->direct_IO(rw, iocb, iov,

offset, nr_segs);

if (rw == WRITE && mapping->nrpages) {

pgoff_t end = (offset + write_len - 1)

>> PAGE_CACHE_SHIFT;

int err = invalidate_inode_pages2_range(mapping,

offset >> PAGE_CACHE_SHIFT, end);

if (err)

retval = err;

}

}

return retval;

}

函数 generic_?le_direct_IO() 对 WRITE 操作类型进行了一些特殊处理,这在下边介绍 write() 系统调用的时候再做说明。除此之外,它主要是调用了 direct_IO 方法去执行直接 I/O 的读或者写操作。在进行直接 I/O 读操作之前,先将页缓存中的相关脏数据刷回到磁盘上去,这样做可以确保从磁盘上读到的是最新的数据。这里的 direct_IO 方法最终会对应到 __blockdev_direct_IO()函数上去。__blockdev_direct_IO() 函数的代码如下所示:

清单 7. 函数 __blockdev_direct_IO()

ssize_t

__blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,

struct block_device *bdev, const struct iovec *iov, loff_t offset,

unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,

int dio_lock_type)

{

int seg;

size_t size;

unsigned long addr;

unsigned blkbits = inode->i_blkbits;

unsigned bdev_blkbits = 0;

unsigned blocksize_mask = (1 << blkbits) - 1;

ssize_t retval = -EINVAL;

loff_t end = offset;

struct dio *dio;

int release_i_mutex = 0;

int acquire_i_mutex = 0;

if (rw & WRITE)

rw = WRITE_SYNC;

if (bdev)

bdev_blkbits = blksize_bits(bdev_hardsect_size(bdev));

if (offset & blocksize_mask) {

if (bdev)

blkbits = bdev_blkbits;

blocksize_mask = (1 << blkbits) - 1;

if (offset & blocksize_mask)

goto out;

}

for (seg = 0; seg < nr_segs; seg++) {

addr = (unsigned long)iov[seg].iov_base;

size = iov[seg].iov_len;

end += size;

if ((addr & blocksize_mask) || (size & blocksize_mask)) {

if (bdev)

blkbits = bdev_blkbits;

blocksize_mask = (1 << blkbits) - 1;

if ((addr & blocksize_mask) || (size & blocksize_mask))

goto out;

}

}

dio = kmalloc(sizeof(*dio), GFP_KERNEL);

retval = -ENOMEM;

if (!dio)

goto out;

dio->lock_type = dio_lock_type;

if (dio_lock_type != DIO_NO_LOCKING) {

if (rw == READ && end > offset) {

struct address_space *mapping;

mapping = iocb->ki_filp->f_mapping;

if (dio_lock_type != DIO_OWN_LOCKING) {

mutex_lock(&inode->i_mutex);

release_i_mutex = 1;

}

retval = filemap_write_and_wait_range(mapping, offset,

end - 1);

if (retval) {

kfree(dio);

goto out;

}

if (dio_lock_type == DIO_OWN_LOCKING) {

mutex_unlock(&inode->i_mutex);

acquire_i_mutex = 1;

}

}

if (dio_lock_type == DIO_LOCKING)

down_read_non_owner(&inode->i_alloc_sem);

}

dio->is_async = !is_sync_kiocb(iocb) && !((rw & WRITE) &&

(end > i_size_read(inode)));

retval = direct_io_worker(rw, iocb, inode, iov, offset,

nr_segs, blkbits, get_block, end_io, dio);

if (rw == READ && dio_lock_type == DIO_LOCKING)

release_i_mutex = 0;

out:

if (release_i_mutex)

mutex_unlock(&inode->i_mutex);

else if (acquire_i_mutex)

mutex_lock(&inode->i_mutex);

return retval;

}

该函数将要读或者要写的数据进行拆分,并检查缓冲区对齐的情况。本文在前边介绍 open() 函数的时候指出,使用直接 I/O 读写数据的时候必须要注意缓冲区对齐的问题,从上边的代码可以看出,缓冲区对齐的检查是在 __blockdev_direct_IO() 函数里边进行的。用户地址空间的缓冲区可以通过 iov 数组中的 iovec 描述符确定。直接 I/O 的读操作或者写操作都是同步进行的,也就是说,函数 __blockdev_direct_IO() 会一直等到所有的 I/O 操作都结束才会返回,因此,一旦应用程序 read() 系统调用返回,应用程序就可以访问用户地址空间中含有相应数据的缓冲区。但是,这种方法在应用程序读操作完成之前不能关闭应用程序,这将会导致关闭应用程序缓慢。

 

接下来我们看一下 write() 系统调用中与直接 I/O 相关的处理实现过程。函数 write() 的原型如下所示:

ssize_t write(int filedes, const void * buff, size_t nbytes) ;

操作系统中处理 write() 系统调用的入口函数是 sys_write()。其主要的调用函数关系如下所示:

清单 8. 主调用函数关系图

sys_write()

|-----vfs_write()

|----generic_file_write()

|----generic_file_aio_read()

|---- __generic_file_write_nolock()

|-- __generic_file_aio_write_nolock

|-- generic_file_direct_write()

|-- generic_file_direct_IO()

函数 sys_write() 几乎与 sys_read() 执行相同的步骤,它从进程中获取文件描述符以及文件当前的操作位置后即调用 vfs_write()函数去执行具体的操作过程,而 vfs_write() 函数最终是调用了 ?le 结构中的相关操作完成文件的写操作,即调用了

generic_?le_write() 函数。在函数 generic_?le_write() 中,函数 generic_?le_write_nolock() 最终调用

generic_?le_aio_write_nolock() 函数去检查 O_DIRECT 的设置,并且调用 generic_?le_direct_write() 函数去执行直接 I/O 写操作。

函数 generic_file_aio_write_nolock() 中与直接 I/O 相关的代码如下所示:

清单 9. 函数 generic_?le_aio_write_nolock() 中与直接 I/O 相关的代码

if (unlikely(file->f_flags & O_DIRECT)) {

written = generic_file_direct_write(iocb, iov,

&nr_segs, pos, ppos, count, ocount);

if (written < 0 || written == count)

goto out;

pos += written;

count -= written;

}

从上边代码可以看出, generic_?le_aio_write_nolock() 调用了 generic_?le_direct_write() 函数去执行直接 I/O 操作;而在generic_?le_direct_write() 函数中,跟读操作过程类似,它最终也是调用了 generic_?le_direct_IO() 函数去执行直接 I/O 写操作。与直接 I/O 读操作不同的是,这次需要将操作类型 WRITE 作为参数传给函数 generic_?le_direct_IO()。

前边介绍了 generic_?le_direct_IO() 的主体 direct_IO 方法:__blockdev_direct_IO()。函数 generic_?le_direct_IO() 对WRITE 操作类型进行了一些额外的处理。当操作类型是 WRITE 的时候,若发现该使用直接 I/O 的文件已经与其他一个或者多个进程存在关联的内存映射,那么就调用 unmap_mapping_range() 函数去取消建立在该文件上的所有的内存映射,并将页缓存中相关的所有 dirty 位被置位的脏页面刷回到磁盘上去。对于直接 I/O 写操作来说,这样做可以保证写到磁盘上的数据是最新的,否则,即将用直接 I/O 方式写入到磁盘上的数据很可能会因为页缓存中已经存在的脏数据而失效。在直接 I/O 写操作完成之后,在页缓存中相关的脏数据就都已经失效了,磁盘与页缓存中的数据内容必须保持同步。

如何在字符设备中执行直接 I/O

在字符设备中执行直接 I/O 可能是有害的,只有在确定了设置缓冲 I/O 的开销非常巨大的时候才建议使用直接 I/O。在 Linux 2.6的内核中,实现直接 I/O 的关键是函数 get_user_pages() 函数。其函数原型如下所示:

int get_user_pages(struct task_struct *tsk,

struct mm_struct *mm,

unsigned long start,

int len,

int write,

int force,

struct page **pages,

struct vm_area_struct **vmas);

该函数的参数含义如下所示:

tsk:指向执行映射的进程的指针;该参数的主要用途是用来告诉操作系统内核,映射页面所产生的页错误由谁来负责,该参数几乎总是 current。

mm:指向被映射的用户地址空间的内存管理结构的指针,该参数通常是 current->mm 。

start: 需要映射的用户地址空间的地址。

len:页内缓冲区的长度。

write:如果需要对所映射的页面有写权限,该参数的设置得是非零。

force:该参数的设置通知 get_user_pages() 函数无需考虑对指定内存页的保护,直接提供所请求的读或者写访问。

page:输出参数。调用成功后,该参数中包含一个描述用户空间页面的 page 结构的指针列表。

vmas:输出参数。若该参数非空,则该参数包含一个指向 vm_area_struct 结构的指针,该 vm_area_struct 结构包含了每一个所映射的页面。

在使用 get_user_pages() 函数的时候,往往还需要配合使用以下这些函数:

void down_read(struct rw_semaphore *sem);

void up_read(struct rw_semaphore *sem);

void SetPageDirty(struct page *page);

void page_cache_release(struct page *page);

首先,在使用 get_user_pages() 函数之前,需要先调用 down_read() 函数将 mmap 为获得用户地址空间的读取者 / 写入者信号量设置为读模式;在调用完 get_user_pages() 函数之后,再调用配对函数 up_read() 释放信号量 sem。若 get_user_pages()调用失败,则返回错误代码;若调用成功,则返回实际被映射的页面数,该数目有可能比请求的数量少。调用成功后所映射的用户页面被锁在内存中,调用者可以通过 page 结构的指针去访问这些用户页面。

直接 I/O 的调用者必须进行善后工作,一旦直接 I/O 操作完成,用户内存页面必须从页缓存中释放。在用户内存页被释放之前,如果这些页面中的内容改变了,那么调用者必须要通知操作系统内核,否则虚拟存储子系统会认为这些页面是干净的,从而导致这些数据被修改了的页面在被释放之前无法被写回到永久存储中去。因此,如果改变了页中的数据,那么就必须使用 SetPageDirty() 函数标记出每个被改变的页。对于 Linux 2.6.18.1,该宏定义在 /include/linux/page_?ags.h 中。执行该操作的代码一般需要先检查页,以确保该页不在内存映射的保留区域内,因为这个区的页是不会被交换出去的,其代码如下所示:

if (!PageReserved(page))

SetPageDirty(page);

但是,由于用户空间所映射的页面通常不会被标记为保留,所以上述代码中的检查并不是严格要求的。

最终,在直接 I/O 操作完成之后,不管页面是否被改变,它们都必须从页缓存中释放,否则那些页面永远都会存在在那里。函数page_cache_release() 就是用于释放这些页的。页面被释放之后,调用者就不能再次访问它们。

关于如何在字符设备驱动程序中加入对直接 I/O 的支持,Linux 2.6.18.1 源代码中 /drivers/scsi/st.c 给出了一个完整的例子。其中,函数 sgl_map_user_pages()和 sgl_map_user_pages()几乎涵盖了本节中介绍的所有内容。

直接 I/O 技术的特点

直接 I/O 的优点

直接 I/O 最主要的优点就是通过减少操作系统内核缓冲区和应用程序地址空间的数据拷贝次数,降低了对文件读取和写入时所带来的 CPU 的使用以及内存带宽的占用。这对于某些特殊的应用程序,比如自缓存应用程序来说,不失为一种好的选择。如果要传输的数据量很大,使用直接 I/O 的方式进行数据传输,而不需要操作系统内核地址空间拷贝数据操作的参与,这将会大大提高性能。

直接 I/O 潜在可能存在的问题

直接 I/O 并不一定总能提供令人满意的性能上的飞跃。设置直接 I/O 的开销非常大,而直接 I/O 又不能提供缓存 I/O 的优势。缓存I/O 的读操作可以从高速缓冲存储器中获取数据,而直接 I/O 的读数据操作会造成磁盘的同步读,这会带来性能上的差异 , 并且导致进程需要较长的时间才能执行完;对于写数据操作来说,使用直接 I/O 需要 write() 系统调用同步执行,否则应用程序将会不知道什么时候才能够再次使用它的 I/O 缓冲区。与直接 I/O 读操作类似的是,直接 I/O 写操作也会导致应用程序关闭缓慢。所以,应用程序使用直接 I/O 进行数据传输的时候通常会和使用异步 I/O 结合使用。

总结

Linux 中的直接 I/O 访问文件方式可以减少 CPU 的使用率以及内存带宽的占用,但是直接 I/O 有时候也会对性能产生负面影响。所以在使用直接 I/O 之前一定要对应用程序有一个很清醒的认识,只有在确定了设置缓冲 I/O 的开销非常巨大的情况下,才考虑使用直接 I/O。直接 I/O 经常需要跟异步 I/O 结合起来使用,本文对异步 I/O 没有作详细介绍,有兴趣的读者可以参看 Linux 2.6 中相

实验 Linux文件和目录操作

实验Linux文件和目录操作(1) 一、实验内容 练习Linux文件和目录操作命令。 二、实验目的 掌握文件与目录管理命令 掌握文件内容查阅命令 三、实验题目 1. 文件与目录管理 (1) 查看CentOS根目录下有哪些内容? (2) 进入/tmp目录,以自己的学号建一个目录,并进入该目录。 (3) 显示目前所在的目录。 (4) 在当前目录下,建立权限为741的目录test1,查看是否创建成功。 (5) 在目录test1下建立目录test2/teat3/test4。 (6) 进入test2,删除目录test3/test4。 (7) 将root用户家目录下的.bashrc复制到/tmp下,并更名为bashrc (8) 重复步骤6,要求在覆盖前询问是否覆盖。 (9) 复制目录/etc/下的内容到/tmp下。 (10) 在当前目录下建立文件aaa。 (11)查看该文件的权限、大小及时间 (12) 强制删除该文件。 (13) 将/tmp下的bashrc移到/tmp/test1/test2中。 (14) 将/test1目录及其下面包含的所有文件删除。 2. 文件内容查阅、权限与文件查找 (1) 使用cat命令加行号显示文件/etc/issue的内容。 (2) 反向显示/etc/issue中的内容。 (3) 用nl列出/etc/issue中的内容。 (4) 使用more命令查看文件/etc/man.config (5) 使用less命令前后翻看文件/etc/man.config中的内容 (6) 使用head命令查看文件/etc/man.config前20行 (7) 使用less命令查看文件/etc/man.config后5行 (8) 查看文件/etc/man.config前20行中后5行的内容 (9) 将/usr/bin/passwd中的内容使用ASCII方式输出 (10) 进入/tmp目录,将/root/.bashrc复制成bashrc,复制完全的属性,检查其日期 (11) 修改文件bashrc的时间为当前时间

Linux基本命令2

Linux基本命令 一、实训目的 ●掌握Linu各类命令的使用方法; ●熟悉Linx操作环境 二、实训内容 练习使用Linux常用命令,达到熟练应用的目的 三、实训步骤 子项目1.文件和目录类命令的使用 利用root用户登录到系统,进入字符界面。 1)用pwd命令查看当前所在目录。 2)用ls命令列出此目录下的文件和目录。 3)用-a选项列出此目录下包括隐藏文件在内的所有文件和目录。 4)用man命令查看ls命令的使用手册 5)在当前目录下,创建测试目录test mkdir test 6)利用ls命令列出文件和目录,确认test目录创建成功 7)进入test目录,利用pwd查看当前工作目录。cd /root/test pwd 8)利用touch命令,在当前目录创建一个新的空文件newfile。touch newfile 9)利用cp命令复制系统文件/etc/profile到当前目录下 cp /etc/profile /root/test 10)复制文件profile到一个新的文件profile.bak,作为备份 cp /etc/profile profile.bak 11)用ll命令以长格的形式列出当前目录下的所有文件,注意比较每个文件的长度和创建时 间的不同 12)用less命令分屏查看文件profile的内容,注意练习less命令的各个子命令,如b、p、q等,并对then 关键字查找。less /etc/profile 13)用grep命令在profile文件中对关键字then进行查询,并与上面的结果比较。 grep then /etc/profle 14)给文件profile创建一个软连接lnsprofile和一个硬链接lnhprofile ln -s profile lnsprofile(创建软连接) ln profile lnhprofile(创建硬链接) 15)一长格形式显示文件profile、lnsprofile和lnhprofile的详细信息。注意比较3个文件链接数的不同。

1_Linux C 文件与IO操作

Linux 文件与I/O操作 Andrew Huang 课程内容 l系统调用 l底层库函数 l标准库函数 l目录与文件维护 系统调用 l Linux 大部分的系统功能是通过系统调用(System Call)来实现的.如open,send之类. l这些函数在C程序调用起来跟标准C库函数(printf…)非常类似.但是实现机制完全不同. l库函数仍然是运行在Linux 用户空间程序.很多时候内部会调用系统调用. l但系统调用是内核实现的.在C库封装成函数.但通过系统软中断进行调用. –用time命令测试时间,系统时间实际就是系统调用时间累积 l time ./demo1 –用strace 可以跟踪一种程序系统调用使用情况 l strace ./demo1 #不需要调试信息 两者关系 l可以参考C库函数malloc与系统调用sbrk的关系

常见C标准库函数 l printf,getch,scanf l strcpy,strcmp,strlen l memcpy,memcmp,memset l fopen,fwrite,fread 常见系统调用函数 l进程控制:fork(),waitpid() l文件控制open(),write() l网络收发函数socket(),bind(),send(),write() l权限控制 access() l标准C的函数,应该在MSDN和Linux下的man都能同时查找联机帮助 –并且声明定义在stdlib.h当中 l而Linux系统调用只能用man查找相应帮助 –大部分声明定义在unistd.h当中 文件控制 1. Linux文件结构 l Linux环境中的文件具有特别重要的意义,因为它们为操作系统服务和设备提供了一个简单而统一的接口.在Linux中,一切(或几乎一切)都是文件。 l通常程序完全可以像使用文件那样使用磁盘文件、串行口、打印机和其他设备。 l大多数情况下,你只需要使用五个基本的函数——open、close、read、write和ioctl l Linux中的任何事物都可以用一个文件代表,或者可以通过特殊的文件进行操作。 l一些特殊文件 –目录 –设备文件 –/dev/console –/dev/tty –/dev/null 2. 底层库函数 l Linux 在底层实现一整套处理文件函数. –这一些函数能处理普通文件,网络socket文件,设备文件等 –全部是系统调用实现的函数 l文件处理函数 –open –打开或创建一个文件 –creat –建立一个空文件 –close –关闭一个文件 –read –从文件读入数据 –write –向文件写入一个数据 –lseek –在文件中移动读写位置

【IT专家】linux下根据进程号PID查找程序路径

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 linux下根据进程号PID查找程序路径 2017/05/26 0 1、执行ps -u hdfs查看hdfs用户下在运行的进程; ?如:ps -u hdfs PID TTY TIME CMD27939 ? 16:07:09 java31211 ? 00:23:16 HwChrDecode ?2、进入/proc相应进程PID的文件夹 ?#cd /proc/27939#ls –ail ?可以看到对应的程序路径 ?ls -ail总计01831010306 dr-xr-xr-x 5 hdfs hadoop 0 03-23 09:13 . 1 dr-xr-xr-x 280 root root 0 03-18 10:18 ..1831010327 dr-xr-xr-x 2 hdfs hadoop 0 05-26 10:33 attr1831010315 -r-------- 1 hdfs hadoop 0 05-26 10:28 auxv1831010316 -r--r--r-- 1 hdfs hadoop 0 05-26 04:18 cmdline1831010337 -rw-r--r-- 1 hdfs hadoop 0 05-26 10:28 coredump_filter1831010326 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 cpuset1831010310 lrwxrwxrwx 1 hdfs hadoop 0 05-26 10:28 cwd - /data1/hadoop/uts2-agent1831010314 -r-------- 1 hdfs hadoop 0 05-26 10:28 environ1831010312 lrwxrwxrwx 1 hdfs hadoop 0 05-26 10:28 exe - /usr/java/jdk1.6.0_35/bin/java1831010313 dr-x------ 2 hdfs hadoop 0 05-26 10:33 fd1831010370 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 io1831010368 -r-------- 1 hdfs hadoop 0 05-26 10:28 limits1831010334 -rw-r--r-- 1 hdfs hadoop 0 05-26 10:28 loginuid1831010319 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 maps1831010309 -rw------- 1 hdfs hadoop 0 05-26 10:28 mem1831010321 -r--r--r-- 1 hdfs hadoop 0 05-26 04:17 mounts1831010322 -r-------- 1 hdfs hadoop 0 05-26 10:28 mountstats1831010320 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 numa_maps1831010336 -rw-r--r-- 1 hdfs hadoop 0 05-26 10:28 oom_adj1831010335 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 oom_score1831010311 lrwxrwxrwx 1 hdfs hadoop 0 05-26 10:28 root - /1831010325 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 schedstat1831010324 -r--r--r-- 1 hdfs hadoop 0 05-26 10:28 smaps1831010317 -r--r--r-- 1 hdfs hadoop 0 05-26 04:18 stat1831010318 -r--r--r-- 1 hdfs hadoop 0 05-26 10:21 statm1831010308 -r--r--r-- 1 hdfs hadoop 0 05-26 04:18 status1831010307 dr-xr-xr-

linux常用操作命令.doc

1 linux常用操作命令 linux系统中通过命令来提高自己的操作能力,下面由小编为大家整理了linux常用操作命令的相关知识,希望大家喜欢! linux常用操作命令一、常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir 创建目录 -p 创建目录,若无父目录,则创建p(parent) cd 切换目录 touch 创建空文件 2 echo 创建带有内容的文件。

cat 查看文件内容 cp 拷贝 mv 移动或重命名 rm 删除文件 -r 递归删除,可删除子目录及文件 -f 强制删除 find 在文件系统中搜索某文件 wc 统计文本中行数、字数、字符数 grep 在文本文件中查找某个字符串rmdir 删除空目录 3 tree 树形结构显示目录,需要安装tree包

pwd 显示当前目录 ln 创建链接文件 more、less 分页显示文本文件内容head、tail 显示文件头、尾内容 ctrl+alt+F1 命令行全屏模式 linux常用操作命令二、系统管理命令 stat 显示指定文件的详细信息,比ls更详细who 显示在线登陆用户 whoami 显示当前操作用户 hostname 显示主机名 4 uname 显示系统信息

top 动态显示当前耗费资源最多进程信息 ps 显示瞬间进程状态ps -aux du 查看目录大小du -h /home带有单位显示目录信息 df 查看磁盘大小df -h 带有单位显示磁盘信息 ifconfig 查看网络情况 ping 测试网络连通 netstat 显示网络状态信息 man 命令不会用了,找男人如:man ls clear 清屏 alias 对命令重命名如:alias showmeit="ps -aux" ,另外解除使用unaliax showmeit 5 kill 杀死进程,可以先用ps 或top命令查看进程的id,然

Linux操作系统进程管理的分析与应用

Linux操作系统进程管理的分析与应用(1)发布时间:2006.05.19 07:12来源:LinuxSir作者:北南南北目录 1、程序和进程; 1.1 进程分类; 1.2 进程的属性; 1.3 父进程和子进程; 2、进程管理; 2.1 ps 监视进程工具; 2.1.1 ps参数说明; 2.1.2 ps 应用举例; 2.2 pgrep 3、终止进程的工具 kill 、killall、pkill、xkill; 3.1 kill 3.2 killall 3.3 pkill 3.4 xkill 4、top 监视系统任务的工具; 4.1 top 命令用法及参数; 4.2 top 应用举例; 5、进程的优先级: nice和renice; 6、关于本文; 7、后记; 8、参考文档; 9、相关文档; 1、程序和进程; 程序是为了完成某种任务而设计的软件,比如OpenOffice是程序。什么是进程呢?进程就是运行中的程序。 一个运行着的程序,可能有多个进程。比如 https://www.360docs.net/doc/1f7105881.html, 所用的WWW服务器是apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请求httpd服务,

apache服务器将会创建有多个httpd进程来对其进行服务。 1.1 进程分类; 进程一般分为交互进程、批处理进程和守护进程三类。 值得一提的是守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。比如在Fedora或Redhat中,我们可以定义httpd 服务器的启动脚本的运行级别,此文件位于/etc/init.d目录下,文件名是httpd, /etc/init.d/httpd 就是httpd服务器的守护程序,当把它的运行级别设置为3和5时,当系统启动时,它会跟着启动。 [root@localhost ~]# chkconfig --level 35 httpd on 由于守护进程是一直运行着的,所以它所处的状态是等待请求处理任务。比如,我们是不是访问 https://www.360docs.net/doc/1f7105881.html, ,https://www.360docs.net/doc/1f7105881.html, 的httpd服务器都在运行,等待着用户来访问,也就是等待着任务处理。 Linux操作系统进程管理的分析与应用(2)发布时间:2006.05.19 07:12来源:LinuxSir作者:北南南北 1.2 进程的属性; 进程ID(PID):是唯一的数值,用来区分进程; 父进程和父进程的ID(PPID); 启动进程的用户ID(UID)和所归属的组(GID); 进程状态:状态分为运行R、休眠S、僵尸Z; 进程执行的优先级; 进程所连接的终端名; 进程资源占用:比如占用资源大小(内存、CPU占用量); 1.3 父进程和子进程; 他们的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止。但子进程终止,父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。 在进程管理中,当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行;

linux高级编程(文件操作)

文件及设备操作 1.基本概念 linux下文件操作的两种方法:原始文件I/O、标准I/O库 标准I/O库: 是C语言的标准输入输出库,是针对流对象FILE 进行的操作,是带缓存的。 原始I/O库:是linux系统提供的文件API,是针对描述描进行的操作,是无缓存机制。 文件描述符:创建一个新文件或打开现有文件时,内核向进程返回的一个非负整数。 其范围在0~OPENMAX之间,OPENMAX是一个宏,不同linux版本取值不同. 系统调用:是操作系统提供的某些功能的接口(函数) 常用设备 /dev/null 空设备,丢弃数据用 /dev/port 存取I/O端口 /dev/ttyN N(0 1 ...) 字符终端 /dev/sdaN N(0 1...) SCSI磁盘 /dev/scdN N(0 1...) SCSI光驱 /dev/mouseN N(0 1...) 鼠标 /dev/socksys 套接字访问端口接口,用于网络传输 /dev/route 路由器控制设备 /dev/fbN N(0 1...) 帧缓冲设备(frame buffer) 重点 /dev/mixer 混音器音量控制、混音控制重点 /dev/dsp 声卡数字采样和数字录音设备用于播放声音和录音经常使用重点(oss) /dev/audio 声卡音频设备用于播放声音和录音,支持sun音频较少使用 /dev/video 视频摄像头用于视频采样(录像) 常用头文件 #include 对外提供的各种数据类型如size_t #include 对外提供的各种结构类型如time_t #include 对外提供的各种错误号的定义用数字代码的错误类型 #include 文件控制的函数定义 #include 串口的结构及定义 #include 声卡的结构及定义 #include 设备控制函数 #include 在C++内加入的头 2.设备的操作函数 #include #include #include #include #include 1)Access

linux常用命令

新手刚刚接触Linux的时候可能处处感到不便,不过没有关系,接触新的事物都有这样的一个过程,在你用过Linux一段时间后,你就会逐渐了解Linux其实和Windows一样容易掌握。 由于操作和使用环境的陌生,如果要完全熟悉Linux的应用我们首先要解决的问题就是对Linux常用命令的熟练掌握。本章我们就来介绍Linux的常用基本命令。 Linux常用命令 1.Linux命令基础 Linux区分大小写。在命令行(shell)中,可以使用TAB键来自动补全命令。即可以输入命令的前几个字母,然后按TAB键,系统自动补全命令,若不止一个,则显示出所有和输入字母相匹配的命令。 按TAB键时,如果系统只找到一个和输入相匹配的目录或文件,则自动补全;若没有匹配的内容或有多个相匹配的名字,系统将发出警鸣声,再按一下TAB键将列出所有相匹配的内容(如果有的话)以供用户选择。 首先启动Linux。启动完毕后需要进行用户的登录,选择登陆的用户不同自然权限也不一样,其中―系统管理员‖拥有最高权限。 在启动Linux后屏幕出现如下界面显示:Red Hat Linux release 9 (Shrike) Kernel 2.4.20.8 on an i686

login: 输入:root(管理员名)后,计算机显示输口令(password:),输入你的口令即可。当计算机出现一个―#‖提示符时,表明你登录成功! 屏幕显示Linux提示符:[root@localhost root]#_ 这里需要说明的是―Red Hat Linux release 9 (Shrike)‖表示当前使用的操作系统的名称及版本。―2.4.20.8‖表示Linux操作系统的核心版本编号。―i686‖表示该台电脑使用的CPU的等级。 下面我们来介绍常用基本命令 一,注销,关机,重启 注销系统的logout命令 1,Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost root]#logout

Linux 查看进程和删除进程

1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab)。 2. ps 命令用于查看当前正在运行的进程。 grep 是搜索 例如: ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 ps -aux | grep java -aux 显示所有状态 ps 3. kill 命令用于终止进程 例如: kill -9 [PID] -9 表示强迫进程立即停止 通常用 ps 查看进程 PID ,用 kill 命令终止进程 网上关于这两块的内容 ----------------------------------------------------------------------------------- PS ----------------------------------------------------------------------------------- 1. ps 简介 ps 命令就是最根本相应情况下也是相当强大地进程查看命令.运用该命令可以确定有哪些进程正在运行和运行地状态、进程是否结束、进程有没有僵死、哪些进程占用了过多地资源等等.总之大部分信息均为可以通过执行该命令得到地. 2. ps 命令及其参数 ps 命令最经常使用地还是用于监控后台进程地工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设 备进行通信地,所以如果需要检测其情况,便可以运用 ps 命令了. 该命令语法格式如下: ps [选项] -e 显示所有进程,环境变量 -f 全格式 -h 不显示标题 -l 长格式 -w 宽输出 a 显示终端上地所有进程,包括其他用户地进程 r 只显示正在运行地进程 x 显示没有控制终端地进程 O[+|-] k1 [,[+|-] k2 [,…]] 根据 SHORT KEYS、k1、k2 中快捷键指定地多级排序顺序显示进程列表. 对于 ps 地不同格式都存在着默认地顺序指定.这些默认顺序可以被用户地指定所覆盖.在这里面“+”字符是可选地,“-” 字符是倒转指定键地方向. pids 只列出进程标识符,之间运用逗号分隔.该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入空格.比如:ps -f1,4,5.

实验11-Linux文件操作(II)

实验11 Linux基本文件操作(II) 实验目的 熟悉与目录和文件操作相关的命令 实验内容与要求 要求 显示当前目录的目录名 改变当前目录 使用ls命令的不同命令选项,来查看文件与目录的属性 创建和删除目录 创建0长度的文件 拷贝、移动、重命名、链接及删除文件 查看文件的内容 内容 一、检查你现在所处的环境 1.登录进入系统:使用pwd命令,确认你现在正处在自己的主目录中。这个目 录就是在你登录时,用户缺省进入的目录。 思考:设置默认主目录的环境变量是PATH 二、查看目录 1.把你的当前目录改变为根目录。 2.确认你的当前目录是根目录,并且使用简单列表命令和长列表命令来列出本 目录中的文件。调用使用-a或-R命令选项的ls命令。每一个命令选项各有什么作用?回到你的用户主目录,并列出所有的文件(包括隐藏文件)3.在你的用户主目录中创建一个名为mydir的新目录。然后调用长列表命令来 查看/home/xxx/mydir目录和/home/xxx目录(只查看目录文件的信息)。注意这里xxx代表的是当前用户名。

4.把目录/home/xxx/mydir变为自己的当前目录。使用touch命令在mydir目录 创建名为myfile1,myfile2的两个文件。 5.使用长列表命令来查看mydir目录中的文件的信息。myfile1与myfile2的文 件大小是多少?再次使用长列表命令,同时列出索引结点(inode)的信息。这两个文件的索引结点号是什么? 6.返回到你的用户主目录,调用ls –R命令来查看你的用户主目录中的目录树 结构。 7.使用rmdir命令删除mydir目录,这个命令工作了吗?请注意rmdir命令不能 删除一个非空的目录。为了删除这个目录,你需要调用命令rm –r。 三、对文件进行操作 1.查看/etc/inittab和/etc/passwd文件的内容。使用命令cat、view、less、more 来分别查看每一个命令的输出方式(提示:/etc/inittab文件包括了系统登录的相关信息,/etc/passwd文件包括了被授权使用该系统的用户的列表)。比较cat、view、less、more这几个命令的异同。 2.拷贝文件/usr/bin/cat到你的用户主目录中。该目录没有cat文件,用find命 令查找 3.拷贝文件/usr/bin/cal到你的用户主目录中。 4.列出你的用户主目录中的文件,你会发现上面两个文件已经被拷贝过来了。 在你的用户主目录中创建一个名为xxxscript的目录 四、对目录进行操作 1.将上面两个文件(cat, cal)移动到xxxscript目录中,并且重新命名为mycat 和mycal; 2.将xxxscript目录变为你的当前目录。列出当前目录中的各个文件名,确认上 述两个文件已经被拷贝过来并已更名。 3.使用mycat命令来显示你的用户主目录中的文件.bash_profile中的内容。返 回到你的用户主目录中。 4.在你的用户主目录中创建另一个子目录goodstuff,拷贝文件/etc/profile到这

Linux常用命令

(1)基于虚拟机的Linux操作系统的使用 1.启动VMware Workstation应用程序,启动Windows以后,选择开始—程序——VMware—VMware Workstation,出现如图7—1所示窗口。 2.选择File—Open选择安装好的Linux虚拟机文件,或者直接单击Start this virtual machine 启动Linux操作系统。 3.启动系统后需要输入用户名和密码,如图7—2所示,用户名为“root”,密码为“jsjxy308”。 4.启动终端,成功进入系统后,选择“应用程序”—“系统工具”—“终端”。 5.在终端中执行Linux 命令,终端运行以后,就可以在这里输入Linux命令,并按回车键执行。 (2)文件与目录相关命令的使用 1.查询/bin目录,看一看有哪些常用的命令文件在该目录下: ll /bin 2.进入/tmp目录下,新建目录myshare: cd /tmp mkdir myshare ls –ld myshare/ 3.用pwd命令查看当前所在的目录: pwd 4.新建testfile文件: touch testfile ls -l 5.设置该文件的权限模式: chomd 755 testfile ls -l testfile 6.把该文件备份到/tmp/myshare目录下,并改名为testfile.bak: cp testfile myshare/testfile.bak ls -l myshare/ 7.在/root目录下为该文件创建1个符号连接: ln -s /tmp/testfile /root/testfile.ln ls -l /root/testfile.ln 8.搜索inittab 文件中含有initdefault字符串的行: cat /etc/inittab | grep initdefault (3)磁盘管理与维护命令的使用 1)Linux 下使用光盘步骤 1.确认光驱对应的设备文件: ll /dev/cdrom 2.挂载光盘: mout -t iso9600/dev/cdrom test/dir 1.查询挂载后的目录: ll /media/cdrom 2.卸载光盘: umount /dev/cdrom 2)Linux下USB设备的使用

Linux下查看进程和线程

在Linux中查看线程数的三种方法 1、top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。 2、ps xH 手册中说:H Show threads as if they were processes 这样可以查看所有存在的线程。 3、ps -mp 手册中说:m Show threads after processes 这样可以查看一个进程起的线程数。 查看进程 1. top 命令 top命令查看系统的资源状况 load average表示在过去的一段时间内有多少个进程企图独占CPU zombie 进程:不是异常情况。一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop 是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。 cpu states: nice:让出百分比irq:中断处理占用 idle:空间占用百分比iowait:输入输出等待(如果它很大说明外存有瓶颈,需要升级硬盘(SCSI)) Mem:内存情况 设计思想:把资源省下来不用便是浪费,如添加内存后free值会不变,buff值会增大。判断物理内存够不够,看交换分区的使用状态。 交互命令: [Space]立即刷新显示 [h]显示帮助屏幕

Linux操作题整理

五、实验题(共5题,每题2分,共10分) 写出下列操作命令: 1、查看/etc/boot路径下的所有内容。 Ls –al /etc/boot/* 2、查看文件/etc/hosts的内容。 Cat /etc/hosts 3、增加一个组账号group1,并指定组账号ID分别为10100。Groupadd –g 10100 group1 4、增加一个用户账号user1(UID为2045,并属于组group1)。Useradd –u 2045 –g group1 user1 5、搜索路径/etc下所有以h开头的文件及目录,拷贝到/software 中。 Cp –r /etc/h* /software 1.按顺序写出下面操作步骤中所用到的命令。

1) 创建新目录my目录 2) 进入my目录 3) 把一个文本文件复制到my目录下同时命名为,该文本文件绝对路径为/user/book/ 4) 把/user/book/移动到my目录下,文件名不变 5) 删除目录my,没有任何提示 答: 1) $mkdir my 2) $cd my 3) $cp /user/book/ 4) $mv /user/book/ 5) $rm -rf my 下安装软件方式有两种:一是安装rpm格式的智能软件包,二是下载源码编译安装,要求安装以下两个软件:和安装,写出所用到的命令 2) 安装,写出解压解包以及标准安装方式所需步骤和命令。

答:(教材82、84、87页) 1) rpm -ivh 参数含义:i表示安装,v表示在安装过程中显示详细的安装信息,h表示显示水平进度条。 2) 源码编译安装方式: ①释放TAR包 使用命令如下:tar zxvf 查看并阅读包内附带的软件安装说明 ③进行编译准备 使用命令如下:./configure ④进行编译 执行make命令 ⑤进行软件安装 执行make install命令 ⑥清楚临时文件 执行make clean命令

Linux系统中的ps进程查看命令使用实例集锦

这篇文章主要介绍了Linux系统中的ps进程查看命令使用实例集锦,包括对ps命令的常用参数总结,整理得非常全面,需要的朋友可以参考下 linux 中ps命令是Process Status的缩写。ps命令可以列出系统中当前运行的进程,所列出的进程是执行ps命令这个时刻正在运行的进程。 如果要动态显示进程信息,需要使用top命令。 通过ps命令,可以确定哪些进程正在运行和运行状态、进程是否结束、进程是否僵死,哪些进程占用过多资源等。 要杀死进程,使用kill命令,例:kill 12345 (12345为进程的pid) linux进程有5种状态 1.运行(正在运行或在运行队列中等待) 2.中断(休眠中,受阻,或等待某个条件的形成或接受到信号) 3.不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生) 4.僵死(进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放) 5.停止(进程受到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行) ps 5种进程状态的标识码如下: R 运行runnable(on run queue) S 中断sleeping D 不可中断uninterruptible sleep (usually IO) Z 僵死a defunct("zombie") process T 停止traced or stopped 命令参数 a 显示所有进程 -a 显示同一终端下的所有程序 -A 显示所有进程 c 显示进程的真实名称 -N 反向选择

-e 等于“-A” e 显示环境变量 f 显示程序间的关系 -H 显示树状结构 r 显示当前终端的进程 T 显示当前终端的所有程序 u 指定用户的所有进程 -au 显示较详细的资讯 -aux 显示所有包含其他使用者的进程 -C<命令> 列出指定命令的状况 –lines<行数> 每页显示的行数 –width<字符数> 每页显示的字符数 –help 显示帮助信息 –version 显示版本显示 输出列的含义 F 代表这个程序的旗标(flag),4 代表使用者为super user S 代表这个程序的状态(STAT),关于各STAT 的意义将在内文介绍 UID 程序被该UID 所拥有 PID 进程的ID PPID 则是其上级父程序的ID C CPU 使用的资源百分比 PRI 这个是Priority (优先执行序) 的缩写,详细后面介绍 NI 这个是Nice 值,在下一小节我们会持续介绍 ADDR 这个是kernel function,指出该程序在内存的那个部分。如果是个running的程序,一般就是“-“

红帽linux常用操作命令

红帽linux常用操作命令 1.查看硬件信息 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源 # free -m # 查看内存使用量和交换区使用量# df -h # 查看各分区使用情况 # du -sh # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载# cat /proc/loadavg # 查看系统负载磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况网络# ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程

Linux2 进程的启动方式

Linux2 进程的启动方式 程序或者命令的执行实际上是通过进程实现的。通常情况下,程序或者命令是保存在硬盘上的,当在命令行中输入一个可执行程序的文件名或者命令并按下Enter 键后,系统内核就将该程序或者命令的相关代码加载到内存中开始执行。系统会为该程序或者命令创建一个或者多个相关的进程,通过进程完成特定的任务。启动进程的方式有两种,分别为前台启动方式和后台启动方式。 1.以前台方式启动进程 在终端窗口的命令行上输入一个Linux命令并按Enter键,就是以前台方式启动了一个进程。例如,在终端窗口上执行“find /-name myfile.txt”命令,就以前台方式启动了一个进程,在该进程还未执行完时,可按下Ctrl+z组合键将该进程暂时挂起,然后使用ps命令查看该进程的有关信息,如图5-1所示。 图5-1 以前台方式启动进程 2.以后台方式启动进程 要在命令行上以后台方式启动进程,需要在执行的命令后添加一个“&”。例如,在终端窗口的命令行上输入命令“find / -name myfile2.txt &”并按下Enter键后将从后台启动一个进程。启动后,系统会显示如下所示的信息: 这里的数字2表示该进程是运行于后台的第2个进程,数字3516是该进程的PID(即进程标识码,用于惟一地标识一个进程)。 然后,出现了shell提示符,这表示已返回到前台。这时,执行ps命令将能够看到现在在系统中有两个由find命令引起的进程,它们的标识号是不同的,因而是两个不同的进程,其中,PID为3385的进程就是刚才被挂起的进程。 如果执行jobs命令可以查看当前控制台中的后台进程,如图5-2所示,可以看到当前在后台有两个进程,其中一个处于运行(Running)状态,另一个,即被挂起的进程处于停止(Stopped)状态。等过一段时间后再使用ps命令进行查看,会发现PID为3516的进程已经结束了,而PID为3385的进程还存在。

Linux系统编程-文件操作

最基本的访问文件方法是:使用read()和write()系统调用。在一个文件能被访问之前,必须通过open() 或者creat()系统调用打开它,一旦使用完毕,则用close()系统调用来关闭文件。 1.open #include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 返回值:成功返回新分配的文件描述符,出错返回-1并设置errno eg: int fd; fd = open("/home/kidd/aaa",O_RDONLY); if(fd == -1) /*error*/ pathname 参数是要打开或创建的文件名,和fopen一样,pathname 既可以是相对路径也可以是绝对路径。 flags参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起来, 所以这些常数的宏定义都以O_开头,表示or 。 以下三个三先一: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开 以下可多选(以或的形式)(进行按位或运算,用以修改打开文件请求的行为) O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容。 (文件将以追加模式下打开。就是说,在每次写操作之前,文件位置指针将被置于文件末尾,即使 在进程刚刚完成写操作并改变文件位置指针之后,如有另一进程开始写操作,情形也是如此。)O_CREAT 若此文件不存在则由(内核来)创建它。使用此选项时需要提供第三个参数mode,表示该文件的访问权限。 有0666。如果文件已存在,本标志无效,除非给出了O_EXCL标志。 当文件创建时,mode参数提供新建文件的权限。系统并不在该次打开文件时检查权限,所以你可以进行相反的操作,例如设置文件为只读权限,但却在打开文件后进行写操作。最终写入磁盘的权限位还需让mode参数与用户文件创建的掩码(即umask)做按位与操作后来确定。 umask 022,mode 0666,文件权限为0644(0666&~022) O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。(用来防止文件创建时出现单键竞争。)O_TRUNC 如果文件已存在且为普通文件,并且以只写或可读可写方式打开,则将其长度截断(Truncate)为0字节。 对于FIFO或者终端设备,该参数被忽略。在其他文件类型上则没有定义。因为截断文件需要写权限,所以O_TRUNC和O_RDONLY同时使用也是没有定义的。 eg: int fd; fd = open("/home/teach/pearl", O_WRONLY|O_TRUNC); if(fd == -1) /*error*/ O_NONBLOCK 对于设备文件,以O_NONBLOCK方式打开可以做非阻塞I/O (Nonblock I/O )。

LINUX 查找进程及终止进程操作的相关命令

使用linux操作系统,难免遇到一些软件卡壳的问题,这时就需要使用linux下强大的kill命令来结束相关进程。这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号。 首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word 1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。 2)ps -A 显示所有程序。 3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。 4)ps -e 此参数的效果和指定A参数相同。 5)ps e 列出程序时,显示每个程序所使用的环境变量。 6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。 7)ps -H 显示树状结构,表示程序间的相互关系。 8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。 9)ps s 采用程序信号的格式显示程序状况。 10)ps S 列出程序时,包括已中断的子程序资料。 11)ps -t<终端机编号; 指定终端机编号,并列出属于该终端机的程序的状况。 12)ps u 以用户为主的格式来显示程序状况。 13)ps x 显示所有程序,不以终端机来区分。 最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作。 其次,使用kill命令结束进程:kill xxx 1)作用 kill命令用来中止一个进程。

2)格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3)参数 -s:指定发送的信号。 -p:模拟发送信号。 -l:指定信号的名称列表。 pid:要中止进程的ID号。 Signal:表示信号。 4)说明 进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。 Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)是Linux系统启动时启动的进程,并在后台运行。例如,httpd 是著名的Apache服务器的监控进程。 kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。 5)应用实例 (1)强行中止(经常使用杀掉)一个进程标识号为324的进程: #kill -9 324 (2)解除Linux系统的死锁

相关文档
最新文档