linux C 学习中的一些小笔记,不断更新

都是一些零散的东西,没有连贯性。


知识一.

 printf也有返回值,表示实际打印的字符数。

 

知识二.

 系统头文件通常位于/usr/include目录下。

 

知识三.

 使用math.h中声明的库函数有一点特殊之处,gcc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。

 

知识四.

系统调用的返回码

全局变量errno  (linux下一般负值表示错误,正值表示成功)

perror(string)

strerror(errno)

 

知识五.

 fprintf(格式化输出数据至文件)
相关函数 printf,fscanf,vfprintf
表头文件 #include<stdio.h>
定义函数 int fprintf(FILE * stream, const char * format,.......);
函数说明 fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束('\0')为止。
返回值关于参数format字符串的格式请参考printf()。成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

范例:

#include<stdio.h>
main()
{
int i = 150;
int j = -100;
double k = 3.14159;
fprintf(stdout,”%d %f %x \n”,j,k,i);
fprintf(stdout,”%2d %*d\n”,i,2,i);
}


执行 -100 3.141590 96
150 150

 

 

知识六.

 关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的;打个很简单的比方,如果你调用socket send函数时;

如果是阻塞模式下:

send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里

如果是非阻塞模式下:

在调用socket send函数时,如果能写到socket缓冲区时,就写数据并返回实际写的字节数目,当然这个返回的实际值可能比你所要写的数据长度要小些(On nonblocking stream oriented sockets,the number of bytes written can be between 1 and the requested length,depending on buffer availability on both the client and server computers),如果不可写的话,就直接返回SOCKET_ERROR了,所以没有等待的过程。


知识七.

系统中默认的常用文件扩展名及其含义为:
  .o
  目标文件
  .c
  C源文件
  .f
  FORTRAN源文件
  .s
  汇编源文件
  .y
  Yacc-C源语法
  .l
  Lex源语法

  在早期的Unix系统系统中还支持Yacc-C源语法和Lex源语法。在编译过程中,系统会首先在makefile文件中寻找与目标文件相关的.C文件,如果还有与之相依赖的.y和.l文件,则首先将其转换为.c文件后再编译生成相应的.o文件;如果没有与目标相关的.c文件而只有相关的.y文件,则系统将直接编译.y文件。


posted @ 2013-02-21 10:18  Never say Ever  阅读(142)  评论(0编辑  收藏  举报