随笔分类 -  linux

linux operation system
摘要:在此,我们将编写一个模块,其中有一个中断函数,当内核接收到某个 IRQ 上的一个中断时会调用它。先给出全部代码,读者自己调试,把对该程序的理解跟到本贴后面。—————————————-#include linux/module.h#include linux/init.h#include linux/interrupt.hstatic int irq;static char *interface;//MODULE_PARM_DESC(interface,”A network interface”);2.4内核中该宏的用法molule_parm(interface,charp,064 阅读全文
posted @ 2010-12-24 12:24 flyxiang
摘要:模块编程属于内核编程,因此,除了对内核相关知识有所了解外,还需要了解与模块相关的知识。1.应用程序与内核模块的比较为了加深对内核模块的了解,表一给出应用程序与内核模块程序的比较。表一 应用程序与内核模块程序的比较C语言应用程序内核模块程序使用函数Libc库内核函数运行空间用户空间内核空间运行权限普通用户超级用户入口函数main()module_init()出口函数exit()module_exit()编译Gcc –cMakefile连接Gccinsmod运行直接运行insmod调试Gdbkdbug, kdb,kgdb等从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间 阅读全文
posted @ 2010-12-24 11:54 flyxiang
摘要:内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。一、 什么是模块模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或 阅读全文
posted @ 2010-12-24 11:53 flyxiang
摘要:6.1下半部下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。对于在上半部和下半部之间划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴:(1)如果一个任务对时间非常敏感,将其放在中断处理程序中执行。(2)如果一个任务和硬件相关,将其放在中断处理程序中执行。(3)如果一个任务要保证不被其它中断打断,将其放在中断处理程序中执行。(4)其它所有任务,考虑放在下半部执行。当我们开始尝试写自己的驱动程序的时候,读一下别人的中断处理程序和相应的下半部会令你受益匪浅。现在的问题是:下半部具体放到以后的什么时候去做呢?下半部并不需要指明一个确切时间,只要把这些任务推迟一点,让他 阅读全文
posted @ 2010-12-24 11:47 flyxiang
摘要:学习了LINUX下用C语言遍历文件夹,一些心得struct dirent中的几个成员:d_type:4表示为目录,8表示为文件d_reclen:16表示子目录或文件,24表示非子目录经过本人亲自试验发现:d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,等等d_name:目录或文件的名称具体代码如下,仅供参考#include stdio.h#include dirent.h#include sys/stat.hvoid List(char *path){ struct dirent* ent = NULL; DIR *pDir; pDir 阅读全文
posted @ 2010-12-17 14:15 flyxiang
摘要:linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。Returns: 0 if OK, error number on failureC99 中新增加了 restrict 修饰的指针: 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 阅读全文
posted @ 2010-12-17 12:36 flyxiang
摘要:linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX这个限制可以在 /usr/include/bits/local_lim.h 中查看对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M可以写一段简单的代码验证最多可以创建多少个线程int main(){int i = 0;pthread_t thread;while (1) {if (pthread_create(&t 阅读全文
posted @ 2010-12-17 12:35 flyxiang
摘要:环境,虚拟机 VirtualBox, 系统Ubuntu9.0.4 编译环境gcc 4.4.0今天看到一个比较常用的函数 fork,用于创造子进程,首先接触到下面的这个函数#include unistd.h;#include sys/types.h; main () { pid_t pid; pid=fork(); if (pid 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %dn",getpid()); else printf("i 阅读全文
posted @ 2010-12-17 12:04 flyxiang
摘要:今天学习了一下pipe管道,用于父子或者相关联的两个进程之间的通讯,pipe使用 pipe()函数建立,必须用于fork建立的进程中,并且需要在fork之前调用,否则是没有效果的,下面是一个例子和用法说明#include unistd.h#include sys/types.h //系统数据类型头文件#include errno.h //出错类型头文件#include stdio.h //标准输入输出 #include stdlib.h //标准系统库int main(void){int pipe_fd[2]; //创建管道描述符,其中pipe_fd[0]为接收描述符,pi 阅读全文
posted @ 2010-12-17 12:03 flyxiang
摘要:标准管道流,用于文件流模式popen();原型 FILE *popen(char *command,char *type);//如果调用成功,则返回一个文件流,如果无法创建则返回NULL,该函数主要用于执行外部程序// command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。//其中type参数是用来表示读或者写的,不能同时为读和写,管道将会以参数type的第一个字符代表的方式打开//popen打开的数据管道流可以使用pclose()关闭, popen,pclose用于打开和关闭数据流//如果pclose(FILE *stream)调用失败,则返回-1;注意,在使用p 阅读全文
posted @ 2010-12-17 12:02 flyxiang
摘要:信号通讯采用raise发送信号#include stdio.h#include stdlib.h#include signal.h#include sys/types.h#include sys/wait.hint main(){pid_t pid; //建立进程IDint ret;if((pid=fork())0){//创建子进程出错,出错处理 }if(pid==0){//子进程中raise(SIGSTOP); //子进程发送一个信号//终止信号exit(0); //子进程退出 }else{printf("pid=%d\n",pid);if(waitpid(pid,SI 阅读全文
posted @ 2010-12-17 12:01 flyxiang
摘要:共享内存共享内存是可以被多个进程共享访问的一部分物理内存,如果多个进程都把一个内存区映射到自身的虚拟地址空间,则这些进程就可以直接访问该共享的内存区域,从而通过共享内存的方式实现多进程间的通讯,共享内存是进程间数据通讯的最快方法.共享内存的实现分为两步:1,创建共享内存,使用shmget函数2,映射共享内存,将创建的共享内存映射到具体的进程空间中去,使用shmat函数int shmget(key_t key,int size,int shmflg); //用于创建一个共享内存共享内存对象的创建或获得。与其它IPC机制一样,进程在使用共享内存区域以前,必须通过系统调用sys_ipc (call值 阅读全文
posted @ 2010-12-17 12:00 flyxiang
摘要:守护进程在linux系统的控制台下敲击 ps -A命令 或者 ps -e命令我们可以看到当前系统的前后台进程,凡是最后一个字符为d的进程都为守护进程,例如smbd,vsftpd,maild,telnetd等等守护进程是没有控制终端的,终端名称都为?,所有守护进程的父进程都是init进程下面创造一个守护进程例子#include stdio.h#include stdlib.h#include string.h#include fcntl.h#include sys/types.h#include unlstd.h#include sys/wait.h#define M 阅读全文
posted @ 2010-12-17 12:00 flyxiang
摘要:我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文 件。如果我们用gcc去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这 样大大提高了开发效率。但是Makefile的语法规则众多,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人望而生畏。下面我 们介绍一个比较通用而且简洁的Makefile,大家只要对它稍作修改就可以用在你们自己的工程里了。现在假设我们有一个工程叫my_project,工程源码目录下面有app1.c,app2.c,app 阅读全文
posted @ 2010-12-17 11:50 flyxiang
摘要:/************** * readtest.c * **************/#include unistd.h#include sys/types.h#include errno.hmain(){int pipe_fd[2];int pipe_fd2[2];pid_t pid;char r_buf[100];char w_buf[4];char* p_wbuf;int r_num;int cmd;memset(r_buf,0,sizeof(r_buf));memset(w_buf,0,sizeof(w_buf));p_wbuf=w_buf;if(pipe(pipe_ 阅读全文
posted @ 2010-12-17 11:30 flyxiang
摘要:void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。例子 :main(){ char *s="Golden Global View"; clrscr(); //clear screenmemset(s,'G',6); printf("%s",s); getchar(); return 0; } memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为 阅读全文
posted @ 2010-12-17 11:29 flyxiang
摘要:system(执行shell 命令)相关函数fork,execve,waitpid,popen表头文件#i ncludestdlib.h定义函数int system(const char * string);函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。返回值=-1:出现错误 =0:调用成功但是没有出现子进程 0:成功退出的子进程的id如果system 阅读全文
posted @ 2010-12-17 11:27 flyxiang
摘要:printf输出颜色和ANSI控制码(高亮,下划线,闪烁,光标位置,清屏等)给printf的输出加上些特效比如颜色,可以让打印信息更鲜明,在debug的时候特别有用。颜色:#define NONE "\033[m"#define RED "\033[0;32;31m"#define LIGHT_RED "\033[1;31m"#define GREEN "\033[0;32;32m"#define LIGHT_GREEN "\033[1;32m"#define BLUE "\033[0;32;34m"#define LIGHT_BLUE "\033[1;34m"#define DARY_GRA 阅读全文
posted @ 2010-12-17 11:20 flyxiang
摘要://基于fork()系统调用//#include "sys/types.h"//包含pid_t等的声明//#include "sys/file.h"//#include "unistd.h"//包含pipe(),fork()等的声明 /*在一般的较新的linux系统(如Ubuntu)中,以上头文件的引入不是必须的,用gcc编译时不会报error*//*如果出现关于pid_t的错误,可以包含以上头文件中任意一个,或者包含stdlib.h*//*如果出现类似于“不兼容的隐式声明”或“incompatible implicit declaration of built-in function *** 阅读全文
posted @ 2010-12-17 11:18 flyxiang
摘要:最近学习了linux的多线程,就写了个测试处理器多线程性能的例子,里面用到了 线程,信号量,互斥锁等,写得比较麻烦,呵呵,但是整体思路用来学习还是不错的.里面多由详细的中文注释;#include stdio.h#include unistd.h#include stdlib.h#include pthread.h#include time.h#include sys/time.h#include semaphore.h#include string.h#include sys/wait.h#define TEST1_NUM 10000 //第一个测试建立的线 阅读全文
posted @ 2010-12-17 11:15 flyxiang