Linux系统开发之C语言基础(1)

2022-08-23 14:04:24 浏览数 (1)

先来看一个经典小程序hello world!

代码语言:javascript复制
#include "stdio.h"
#include "stdlib.h"

int main(void)
{
    printf("Hello world!n");
    exit(0);
}

注意: ①printf函数在stdio.h文件里,需要包含头文件stdio.h ②exit函数在stdlib.h文件里,需要包含头文件stdlib.h文件 ③‘n'除了换行的作用外,还有刷新缓冲区的功能 ④关于main函数的写法,读者可能见过很多种,包括 void main(void) void main() int main() int main(void) int main(int agrc, char** argv)// char* agrv[] 编者在这里建议读者使用后面两种写法,严格上讲这两种才是标准的。

学习Linux最好的方式就是查man手册

我来man一下exit函数 在linux终端下输入: man 3 exit

代码语言:javascript复制
NAME
       exit - cause normal process termination

SYNOPSIS
       #include <stdlib.h>

       void exit(int status);

DESCRIPTION
       The exit() function causes normal process termination and the value of status & 0377 is returned to the parent (see wait(2)).

       All  functions  registered with atexit(3) and on_exit(3) are called, in the reverse order of their registration.  (It is possible for one of these func‐
       tions to use atexit(3) or on_exit(3) to register an additional function to be executed during exit processing; the new  registration  is  added  to  the
       front  of  the  list of functions that remain to be called.)  If one of these functions does not return (e.g., it calls _exit(2), or kills itself with a
       signal), then none of the remaining functions is called, and further exit processing (in particular, flushing of stdio(3) streams) is abandoned.   If  a
       function has been registered multiple times using atexit(3) or on_exit(3), then it is called as many times as it was registered.

       All open stdio(3) streams are flushed and closed.  Files created by tmpfile(3) are removed.

       The  C standard specifies two constants, EXIT_SUCCESS and EXIT_FAILURE, that may be passed to exit() to indicate successful or unsuccessful termination,
       respectively.

RETURN VALUE
       The exit() function does not return.

如果你英文不太好,没关系,这里先提供谷歌翻译给你~

代码语言:javascript复制
名称
       退出-导致正常进程终止

概要
       #include <stdlib.h>

       void exit(int status);

描述
       exit()函数导致正常进程终止,并且状态&0377的值返回给父级(请参阅wait(2))。

       在atexit(3)和on_exit(3)上注册的所有函数均以与注册相反的顺序调用。 (这些功能之一可能
       使用atexit(3)或on_exit(3)来注册要在退出处理期间执行的其他功能的说明;新注册已添加到
       如果这些函数之一未返回(例如,它调用_exit(2)或使用
       信号),则不调用其余功能,而放弃进一步的退出处理(特别是stdio(3)流的刷新)。如果一个
       已使用atexit(3)或on_exit(3)多次注册该函数,然后调用该函数的次数与已注册的次数相同。

       所有打开的stdio(3)流都被刷新并关闭。由tmpfile(3)创建的文件将被删除。

       C标准指定了两个常量EXIT_SUCCESS和EXIT_FAILURE,可以将其传递给exit()来指示成功或失败的终止,
       分别。

返回值
       exit()函数不会返回。

我们来编译一下hello.c

一个源文件经过一个什么样的过程才能被执行? 源文件-->预处理-->编译-->汇编-->链接-->可执行文件

预处理

以#开头的命令称为预处理命令,像#include, #if, #ifndef, #indef等命令,预处理是将宏定义展开,根据条件编译选择使用到的代码,输出到.i文件等待下一步处理. 使用arm-linux-cpp工具

编译

编译就是将.i文件翻译成汇编代码 使用ccl工具

汇编

汇编就是将上一步输出的文件翻译成符合一定格式的机器码,机器码就是机器识别的代码,例如01010101这样的.在linux系统一般为elf文件或者obj文件. 使用arm-linux-as工具.

链接

链接就是将上一步得到的文件跟库文件链接起来,最终生成可以在特定平台运行的可执行文件.

运行如下:

0 人点赞