时间:2015-5-1
内容:《嵌入式Linux程序设计与应用案例》学习笔记
---------------------------------------------------------------------------
1、程序的分割
当在建立大型程序时,如果把已经建好的函数分割出来,应用在其他程序里,可以帮助大型程序的开发。
如果将一个main.c函数分解成mymain.c、mytool.c、mytool.h,其中mytool.h中包含了mytool.c所用到的函数。在主程序中如果要实现mytool中的函数功能,只需要加载相应的头文件mytool.h。
编译时可采用如下指令实现:gcc mymain.c mytool.c -o ex_main
2、.o文件的解释
.o文件就是对象文件,里面包含的内容就是“0”、“1”这样机器可执行的指令,当程序要执行时还需要链接(link).链接就是把多个.o文件链成一个可执行文件。
3、rand()函数与srand()函数
rand()函数可用来产生随机数,srand()函数用于设置随机数种子。只有随机数种子发生变化才能产生不同的随机数。
4、数组分别传递给数组与指针
例如一个数组int score[5],当分别调用mysum(score)与myavg(score)时,它会传递给另一个数组与指针,表现形式如下:
//传递给数组
int mysum( int t[] )
{
}
//传递给指针
double myavg( int *p)
{
}
5、GCC常用选项
-o: 指定输出的文件名称,如果不指定,默认输出文件名为a.out。
-c: 只作编译不作连接。(会生成.o文件)
-I: 指定include file 的目录。
-L: 指定library file的查找目录。
-Wall: 发出gcc可以提供的所有有用的警告信息。
6、目录权限的修改
对于没有子目录中的所有文件,可采用:chmod 666 /mydoc/*
当前目录里包含子目录时,必须使用-R参数表示要设置所有文件及子目录的权限:chmod -R 666 /mydoc/*
7、文件描述符
Linux系统运行时,会自动打开3个文件描述符0、1、2。
0:代表标准输入
1:代表标准输出
2:代表标准错误
8、system()函数
system( " touch file1 " ),上述命令的意义为调用system()函数来运行shell命令touch file1。
9、精炼的文件复制函数段
while(( nbytes = read(fdsrc, buf, 20 )) > 0) //fdsrc位源文件件描述符
{
z = write( fddes, buf, nbytes ); //fddes为目标文件描述符
if(z < 0){
perror("write des file");
}
}
10、fork()函数
fork()函数创建子进程时,在父进程中会返回子进程的PID,在新建的子进程中会返回0。
11、wati()函数
wait()函数会暂停父进程的运行,使其处于等待状态,一旦子进程运行完,等待中的父进程就会重新运行。
如果有多个子进程在运行,则父进程在调用wait()函数后,会在第一个子进程结束并返回时恢复父进程的执行。
12、函数指针
函数在经过编译器编译后,会在内存中占有一块区域,这块区域的起始位置称为函数地址,而用来保存函数地址的指针称为函数指针。
例:一个返回值为int类型的函数指针。
<span style="font-size:14px;"> int (*pm)(int x, int y) </span>
函数指针pm可用来保存函数的起始地址,注意,当要把函数地址指定给函数指针时,函数的地址以“函数名称”来表示,不需要加上地址运算符&。
例如:
<span style="font-size:14px;"><span style="white-space:pre"> </span>int mamax(int x, int y)
<span style="white-space:pre"> </span>{......}
<span style="white-space:pre"> </span>pm = mamax;</span>
另一方面,当在程序中利用函数指针调用函数,只需要使用指针运算符“*”即可。如
<span style="font-size:14px;"><span style="white-space:pre"> </span>max = (*pm)(num1, num2);</span>
13、signal()函数
signal(A, B),A为信号,B为函数指针。B也可以是两个常量,如下:
SIG_IGN:表示要忽略信号。
SIG_DFL:表示要恢复系统对信号的默认处理功能。
14、kill()函数
kill(pid, sig),pid为指定的进程,sig为传送的信号。kill函数用于给指定的进程传送信号。
15、pause()函数
pause函数会使当前进程暂停,使其进入休眠状态,直到当前进程接收到信号后才会醒来。
16、waitpid()函数与wait()函数的区别
wait和waitpid的不同在于wait会令调用者阻塞直至某个子进程终止而waitpid则可以通过设置一个选项来设置为非阻塞,另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。
17、管道pipe
int pipe(int fd[2]),其中fd[0]用于读,fd[1]用于写。注:父子两个进程同时拥有对同一个管道的读写控制权,但是由于管道是单向的,为了要交换数据,必须决定哪一个进程用来来读,哪个进程用来写入。一般规则,读进程会关闭pipe的write端,写会关闭read端。
18、unlink()函数
unlink函数的真正含义:删除目录相并减少一个连接数,如果链接数为0并且没有任何进程打开该文件,该文件内容才能被真正删除,但是若又进程打开了该文件,则文件暂时不删除直到所有打开该文件的进程都结束时文件才能被删除。
19、有名管道
用mkfifo()函数建立有名管道时,该文件的名必须不存在!FIFO的大小在limits.h文件中,其宏名为PIPE_BUF。此文件大小通常为4096B。
20、sprintf()函数
函数功能:把格式化的数据写入某个字符串
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)
例子:
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. " 这字符串写到s中
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
21、exit(0)与exit(1)、return区别
exit(0):正常运行程序并退出程序;
exit(1):非正常运行导致退出程序;
return():返回函数,若在主函数中,则会退出函数并返回一值。
详细说:
1. return返回函数值,是关键字; exit 是一个函数。
2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
3. return是函数的退出(返回);exit是进程的退出。
4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。
5. return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出, 非0 为非正常退出。
6. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。
22、RS232程序设计
O_NOCTTY标签告诉Linux,这个程序不想控制TTY界面。O_NDELAY标签则告诉Linux,这个程序不介意RS-232的DCD信号的状态,如果不设置这个标签,那么程序将会处于sleep状态,知道RS-232有DCD信号进来。
23、atof()函数
功 能: 把字符串转换成浮点数
用 法: double atof(const char *nptr);
例程:
<span style="font-size:14px;"><span style="white-space:pre"> </span>#include<stdlib.h>
<span style="white-space:pre"> </span>#include<stdio.h>
<span style="white-space:pre"> </span>intmain()
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>double d;
<span style="white-space:pre"> </span>char*str="12345.67";
<span style="white-space:pre"> </span>d=atof(str);
<span style="white-space:pre"> </span>printf("string=%sdouble=%lf\n",str,d);
<span style="white-space:pre"> </span>return0;
<span style="white-space:pre"> </span>}</span>
函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。24、strtok()函数
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。