易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 : linux

解决Linux中Too many open files问题

1、相关命令:
ulimit –a //查看当前设置
ulimit –n 2048 //即设成2048,按实际需要设置
2、用户环境参数文件配置:
在/etc/profile中加入如下内容:
if
 [ $SHELL 
=
 
"
/bin/ksh
"
 ]; then 
ulimit 
-

16384
 ulimit 
-

65536
 
else
 
ulimit 
-

16384
 
-

65536
 
fi
3. 修改 /etc/security/limits.conf文件中设置最大打开文件数
添加如下这行。
* - nofile 30000
这行设置了每个用户的默认打开文件数为30000。注意"nofile"项有两个可能的限制措施。就是项下的hard和soft。要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定, 则hard和soft设定会同时被设定。
* hard nofile 65535
* soft nofile 65535
......

Linux系统共享库编程

一、说明
  类似Windows系统中的动态链接库,Linux中也有相应的共享库用以支持代码的复用。Windows中为*.dll,而Linux中为*.so。下面详细介绍如何创建、使用Linux的共享库。
二、创建共享库
在mytestso.c文件中,代码如下:
#include <stdio.h>
#include <stdlib.h>
int GetMax(int a, int b)
{
if (a >= b)
return a;

return b;
}
int GetInt(char* psztxt)
{
if (0 == psztxt)
return -1;

return atoi(psztxt);
}

然后使用下列命令进行编译:
gcc -fpic -shared mytestso.c -o mytestso.so
-fpic 使输出的对象模块是按照可重定位地址方式生成的
编译成功后,当前目录下有mytestso.so,此时已成功创建共享库mytestso.so。
三、使用共享库
  共享库中的函数可被主程序加载并执行,但是不必编译时链接到主程序的目标文件中。主程序使用共享库中的函数时,需要事先知道所包含的函数的名称(字符串),然后根据其名称获得该函数的起始地址(函数指针),然后即可使用该函数指针使用该函数。
在mytest.c文件中,代码如下:
#include <dlfcn.h>
#include <stdio.h>
int main(int argc, char* ......

linux 共享库基本使用

1 创建和使用静态库
创建一个静态库是相当简单的。通常使用 ar 程序把一些目标文件(.o)组合在一起,
成为一个单独的库,然后运行 ranlib,以给库加入一些索引信息。
2 创建和使用共享库
特殊的编译和连接选项
-D_REENTRANT         使得预处理器符号 _REENTRANT 被定义,这个符号激活一些宏特性。
-fPIC                选项产生位置独立的代码。由于库是在运行的时候被调入,因此这个
                     选项是必需的,因为在编译的时候,装入内存的地址还不知道。如果
                     不使用这个选项,库文件可能不会正确运行。
-shared              选项告诉编译器产生共享库代码。
-Wl,-soname          -Wl 告诉编译器将后面的参数传递到连接器。而 -soname 指定了
            &n ......

Linux中 静态库和共享库

1. 创建目录
 mkdir –p test/sub
2. 在子目录sub/下编写hello.c和hello.h
 /*****hello.c*****/
 #include <stdio.h>
 #include “hello.h”
 void hello()
 {
 printf(“Hello!\n”);
 }
 
 /*****hello.h*****/
 #include <stdio.h>
 void hello();
3. 编译链接/打包
 gcc –c hello.c –o hello.o
 ar cqs libhello.a hello.o
4. 在主目录test/下编写main.c
 #include <stdio.h>
 #include “sub/hello.h”
 int main()
 {
 hello();
 retrun 0;
 }
5. 编译链接
 gcc –c main.c –o main.o
 gcc main.o –o main.exe –L “sub/” –lhello          #dynamically linked (uses shared libs)
 或gcc main.o –o main.exe –static –L “sub/” –lhello  # statically linked
--------- ......

Linux设备驱动编程之阻塞与非阻塞

阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。
  在Linux
  关于上述例程,我们补充说一点,如果将驱动程序中的read函数改为:
static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
 //获取信号量:可能阻塞
 if (down_interruptible(&sem))
 {
  return - ERESTARTSYS;
 }
 //等待数据可获得:可能阻塞
 if (wait_event_interruptible(outq, flag != 0))
 {
  return - ERESTARTSYS;
 }
 flag = 0;
 //临界资源访问
 if (copy_to_user(buf, &global_var, sizeof(int)))
 {
  up(&sem);
  return - EFAULT;
 }
 //释放信号量
 up(&sem);
 return sizeof(int);
}
  即交换wait_event_interruptible(outq, flag != 0)和down_interruptible(&sem)的顺序,这个驱动程序将变得不可运行。实际上,当两个可能要阻塞的事件同时出现时,即两个wait_event或down摆在一起的时候,将变 ......

Linux学习笔记零零三

存储管理
MMU与内核内存管理的关系
从线性地址到物理地址的映射,通过页目录表和页表来实现的。
内核为存储管理维护了一套复杂的数据结构,页目录表和页表是主要的结构之一。这些表也是存储在物理内存页面中的,因此,也是以4K为单位。
表中的每个表项都记录了一个32位的地址,为4个字节,因此,一个表中最多可以有1K项,这也是线性地址划分的依据。
32位的线性地址划分为3部分。最高10位代表页目录表的索引。紧接着的10位对应页表的索引。最后12位对应页内的偏移地址。
MMU与内核内存管理的分工和协作:
MMU从硬件上实现虚拟地址到物理地址的映射。内核的内存管理实现对一系列数据结构的维护和管理。
在系统启动时,内核为每一个4K的物理内存页面维持一个叫page的数据结构,这个数据结构是每一个物理内存页面的ID。内核维持了一个叫Mem_page的结构体数组,记录了所有的page。并引入了管理区的概念,对DMA、高地址区和正常区进行了分类。
在启动进程时,内核为进程的用户空间做了初始化,这些初始化工作包括堆栈区、静态数据区、全局数据区、代码区。并初始化了一套结构来维持这些状态,通过划分虚拟区间来记录。
此外,内核还构建了页目录表、页表等结构,并将页目 ......
总记录数:5772; 总页数:962; 每页6 条; 首页 上一页 [603] [604] [605] [606] 607 [608] [609] [610] [611] [612]  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号