天天看点

一些LinuxC的小知识点(一)

输入结果:

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

当我们运行Linux下的C语言程序的时候,就可以非常方便地用getopt()这个函数将main参数中的argv提取出来,按需进行处理。函数的使用见以下代码段。

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

1、_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。

2、exit中的参数exit_code为0代表进程正常终止,若为其他值表示程序执行过程中有错误发生。

大家可以通过以下代码看看两者的异同。

一些LinuxC的小知识点(一)
stdout(Standard Output Stream)标准输出 stdin(Standard Input Stream)标准输入 stderr(Standard Error Output)标准错误输出

默认情况下,标准输入(stdin)指的从键盘上读数据,而标准输出(stdout)和标准错误输出(stderr)是指屏幕

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

结果:

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

另外,Linux是一个多用户的系统,我们可以通过利用’/dev/tty‘正确地将信息输出到用户正在使用的终端上。

功    能:把文件流指针转换成文件描述符 

相关函数:open, fopen 

表头文件:#include <stdio.h> 

定义函数:int fileno(FILE *stream) 

函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词 

返回值  :返回和stream文件流对应的文件描述符。如果失败,返回-1。 

范例:

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

    文件描述词是Linux编程中的一个术语。当一个文件打开后,系统会分配一部分资源来保存该文件的信息,以后对文件的操作就可以直接引用该部分资源了。文件描述词可以认为是该部分资源的一个索引,在打开文件时返回。在使用fcntl函数对文件的一些属性进行设置时就需要一个文件描述词参数。 

    以前知道,当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。 

    需要指出的是,上面的流式文件输入、输出和文件描述符的输入输出方式不能混用,否则会造成混乱。

请看一下下面的代码,我们期待输入’12345678’(8个数),用fgets函数输出’12345678’(8个数).

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

我们可以看出,输出的结果并不是我们所期望的,但是我们也命名在fget里面写了,我们期望的获取8个数(PASSWORD_LEN==8)。原来fget一次调用只能传输n-1个字符,因为它必须把空字节’\0’加上以结束字符串。也就是,如果我们要让输出跟我们的期望相符,那么我们要修改fget函数的参数,如下代码段所示。

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

结果分析:

如果输出++a=1,a++=1,那么说明函数是从左执行到右的;如果++a=2,a++=0,那么说明函数是从右执行到左的。

结果截图:

一些LinuxC的小知识点(一)

首先,让我们先看看两个跟时间有关的类型time_t,tm。

time_t:它是一个大到能容纳以秒计算的日期和时间的整数类型。在32位系统上就是32位的的。

tm结构体被定义为至少包含下表所示的成员。

一些LinuxC的小知识点(一)

以下代码段展示的是如何获取当前的时间

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

      在c中,为了解决一些频繁调用的小涵数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。 

      可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 

下面我们来看一个例子

一些LinuxC的小知识点(一)
一些LinuxC的小知识点(一)

     上面的例子就是标准的内联涵数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用 dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。 

      说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。 

      说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也能够做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。

参考

<a href="http://book.douban.com/subject/4831448/">《Linux程序设计 第四版》</a>

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3148055.html如需转载请自行联系原作者

kissazi2

<a href="http://blog.csdn.net/yapingmcu/article/details/7378170">linux c inline</a>

继续阅读