1.system("/etc/rc.d/init.d/leds start"); 就相当于在开发板的终端下输入system里面的命令
2. int fd = open("/dev/leds", 0); 第一个参数是打开的文件驱动,第二个参数是打开文件的权限。详见linux系统函数,不成功会返回-1
int fd = open("/dev/leds0", 0); //先打开一个虚拟设备
if (fd <</SPAN> 0) {
fd = ::open("/dev/leds", 0);
}
if (fd <</SPAN> 0) {
perror("open device leds");
exit(1);
}
buttons_fd = open("/dev/buttons",0); /* 以0 方式打开*/
if(buttons_fd < 0) /* 打开出错就会返回一个负值*/
{
perror("open device buttons"); /*perror函数?*/
exit(1); /* 返回1*/
}
3.close(fd); // 关闭设备
4. ioctl是设备驱动程序中对设备的I/O通道进行管理的函数,如 ioctl(fd, 1, iData); 第一个参数是文件描述符,第二个是cmd,第三个是传递的数据。
5. read()函数 在用之前要先定义buf 和count char buff[];是char 型的 const可以利用buff来生成 。const可以多余要读的字节数。
ssize_t read(int fd, char *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0
6. write()函数 在用之前要先定义buf 和count
函数向打开的设备或文件中写数据。ssize_t write(int fd, const void *buf, size_t count);
返回值:成功返回写入的字节数,出错返回-1并设置errno写常规文件时,write的返回值通常等于请求写的字节数 count,而向终端设备或网络写则不一定。
7. sscanf(buffer, "%d", &value); sscanf()函数即将字符型的数据转换成整型的数据输出。。和sprintf()函数相反
8. void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);
//start 指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回
//参数length代表将文件中多大的部分对应到内存。
//参数prot代表映射区域的保护方式
//fd文件描述符
//参数offset为文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小
//的整数倍,映射文件的起动位移量受系统虚存页长度的限制,那么如果映射区的长度不是页长度的整数
/倍时,将如何呢?假定文件长12字节,系统页长为512字节,则系统通常提供512字节的映射区,其中
//后500字节被设为0。可以修改这500字节,但任何变动都不会在文件中反映出来
//若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1)
内核空间调用
int (*mmap) (struct file *filp, struct vm_area_struct *vma); 映射之前要申请内存 //通常只用于块设备
9. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值, count:是buffer的长度. Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
10. wait(NULL);等待子进程退出
pid = wait(NULL);
如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
11. if((shmid = shmget(IPC_PRIVATE,5,PERM))== -1)
exit(1);
p_addr = shmat(shmid,0,0);
memset(p_addr,'\0',1024);
申请共享内存,并映射和初始化
12. select()函数 它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。 即可以监视多个文件有无数据的输入 http://blog.csdn.net/olinxi1234567/article/details/24256821
使用select函数的过程一般是:
以下是一个测试单个文件描述字可读性的例子:
int isready(int fd)
{
int rc;
fd_set fds;
struct tim tv;
FD_ZERO(&fds);
FD_SET(fd,&fds);
tv.tv_sec = tv.tv_usec = 0;
rc = select(fd+1, &fds, NULL, NULL, &tv);
if (rc < 0) //error
return -1;
return FD_ISSET(fd,&fds) ? 1 : 0;
}
fd_set rds; /*fd_set 是types.h中定义的类型,实质上是int 型*/ /*rds 用来存储设备号*/
int ret;
FD_ZERO(&rds); /*rds 初始化*/
FD_SET(buttons_fd, &rds); /*将buttons设备号赋给rds*/
/*监听获取键值*/ /*使用系统调用select 检查是否能够从/dev/buttons 设备读取数据*/
ret = select(buttons_fd + 1, &rds, NULL, NULL, NULL);select的用法 监听阻塞事件
/*对ret 的处理*/
if(ret < 0) /* 当ret 小于0*/ 错误
{
perror("select");
exit(1);
}
if(ret == 0) /*当ret 等于0*/ 超时
{
printf("Timeout.\n");
}
else /* 能够读到数据*/
if(FD_ISSET(buttons_fd,&rds)) /*用于测试指定的文件描述符是否在该集合中*/
{
/* 读取键盘驱动发出的数据*/
}
13. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
14. 当进程调用一种execl函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用execl并不创建新进程,所以前后的进程ID并未改变。execl只是用另一个新程序替换了当前进程的正文、数据、堆和栈段.
15. ls > count.txt 将当前目录下的所以文件列些出来,放在count.txt文件中,是一个文件名占一行。
system("ls > count.txt");
16. Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的
17.memcpy()函数可以用于对于内存的访问,共享内存和非共享内存
void *memcpy(void*dest, const void *src, size_t n);
功能:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
18.子进程运行结束后(正常或异常),并没有马上从系统的进程分配表中被删掉,而是进入僵死状态(Zombie),一直等到父进程来回收它的结束状态信息。如果父进程没有回收走子进程的结束状态就已经退出,子进程将永远处于僵死状态;也有例外,如父进程先于子进程结束,子进程将被init进程继承,并回init进程回收其结束状态信息。。谁创建谁负责 在进程运行结束后,我们会显示的调用exit()或者return退出正在运行的进程,如果调用return的话,编译器会自己加上exit().此时,保存子进程的一部份信息是很有必要的,因为父进程可以读取这些消息而取得子进程的退出状态.如果子进程退出.但父进程没有用wait(),这就成为了我们常说的僵尸进程,
19.摄像头应用程序的编写步骤
打开设备-> 检查和设置设备属性->设置帧格式-> 设置一种输入输出方法(缓冲区管理)-> 循环获取数据-> 关闭设备。
20.time_t t = time(NULL);
pic_name = ctime(&t);//pic_name 为char*型的字符串 就我们通常所看到的时间格式
21.使用UDP进行程序设计可以分为客户端和服务器端两部分。
1.服务器端程序包括:
Ø 建立套接字
Ø 将套接字地址结构进行绑定
Ø 读写数据
Ø 关闭套接字
2.客户端程序包括:
Ø 建立套接字
Ø 读写数据
Ø 关闭套接字
它们分别对应socket(),bind(),sendto(),recvfrom(),和close()函数。
22.
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
获得本地时间
23.kill(play_pid,SIGKILL);杀死进程
24.Linux中库文件的生成 http://blog.csdn.net/olinxi1234567/article/details/41286061
24.原型:extern void *malloc(unsigned int num_bytes);
头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放
申请内存
1:用户空间申请内存
void *malloc(size_t size) //返回类型为空指针类型
void free(void *ptr);
Malloc()函数用来在堆中申请内存空间,free()函数释放原先申请的内存空间。Malloc()函数是在内存的动态存储区中分配一个长度为 size 字节的连续空间.
2:内核空间申请内存
在内核空间中,设计到申请内存的函数有kmalloc(),__get_free_page()和vmalloc函数。kmalloc()和__get_free_page()申请的内存位于物理内存映射区域,在物理上是连续的,而且与真实的物理地址只有一个固定的偏移。而vmalloc是在虚拟内存空间中申请一片连续的区域,而这片区域在物理地址上,不一定连续。
Void *kmalloc(size_t size, int flags);
__get_free_pages(unsigned int flags, unsigned int order);
Void *vmalloc(unsigned long size);
释放内存,分别对应为:
Void kfree(void *ptr);
Void free_page(unsigned long addr);
Void vfree(void *ptr);
23.
while(1)
{
exit(1);//终止这次循环,继续下次循环
}