您的位置:首页 > 其它

Day21、Unix开始:操作系统基础、gcc的一些应用、标准C库函数及帮助

2016-08-25 21:49 316 查看
前期学的是 标C

之后学     UC

Linux C  vi 编辑器    gcc编译器

Windows C vc++ 6.0  IDE集成环境

开发C语言的运行环境是unix操作系统

 

软件分为系统软件和应用软件

 

什么是操作系统?

1、 是一款系统软件

2、 管理硬件

3、 是用来管理软件资源的一款系统软件

操作系统的模块:

1、 内存管理 

2、 文件管理

3、 文件系统管理

4、 进程管理

5、 线程管理

6、 用户管理

7、 网络管理

8、 信号管理

操作系统:windows  |  unixlinux  macos  ios android

 


 

Shell是用户和操作系统的交互窗口,也是一款软件

学习的环境用的是bash

用户在bash提供的交互窗口下输入命令,然后由bash将命令中需要操作系统帮助的部分交给操作系统完成,完成后将结果通过bash输出给用户

 

标准C库 : 仓库里存放着C语言的函数,有时也叫函数库

fopen fclose  fread  fwrite malloc

System call :系统调用,本质也是函数

Open  close   read  write

寻求帮助的方式:

man 1   command      linux命令

man 2   system call    系统调用(函数)的帮助

man 3   malloc        标C的帮助

 

- rw - r- -r- -

-rw-                      r- -              r- -

用户权限(开发人员)     同组人员权限     其他人员

 

Linux下行业标准:

一个程序正确的执行完毕,返回值为0 ,错误的返回值为非0.

最基本的框架:

  1int main(void){

 2     return 0;

  3 }

./a.out    没有结果    echo $? 显示0

echo $?  :显示上一个命令执行的返回值

框架   组件    (主函数就是一个框架 ,printf函数就是框架中的一个组件)

strace ./a.out   

Linux是什么?Linux的历史 ?

unix的一些情况:

1970年诞生的操作系统,汇编语言写的,C语言重写

GNU是什么?

基于unix系统调用写了一些应用程序  vi  gccbash…

GNU项目组织,开发应用程序,因为Unix系统的局限性,就从应用软件来完善,不修改系统

Posix C 标准

Linux  :发起编写Linux操作系统内核的组织,通过互联网,遵循posix C 标准

GUN / linux :操作系统

《GNU宣言》

计算机语言的发展:

计算机只有二进制 1 0

机器指令----汇编语言,对汇编语言再进行封装,形成C语言的关键字

  #include<stdio.h>

  int main(){

      printf("hello world\n");

      return 0;

   }



gcc编译器的使用

实例说明:hello.c

第一步:编译理过程    在编译前对源文件进行预先处理

预处理指令:1、宏定义 2、文件包含 3 条件编译

所有以#(sharp)开头的叫做预处理过程,在编译前起作用

输入指令gcc –E hello.c –o hello.i  ,生成hello.i

第二步:编译过程     从源文件到汇编语言

输入指令 gcc –S hello.i  (–o  hello.s),

或者gcc  –S hello.c  –o  hello.s,

生成 hello.s

第三步:汇编过程   将汇编语言翻译成机器指令(机器语言),生成可执行文件

gcc  –c  hello.s

gcc –c hello.i

gcc –c hello.c

生成hello.o

file命令的使用: file 文件名  查看该文件的类型

第四步:链接   将目标文件和和标准库链接,生成可执行文件

gcc hello.o–o hello   形成hello可执行文件

实验

tarena@tarena-virtual-machine:~/day21$ ls

hello.c

tarena@tarena-virtual-machine:~/day21$ gcc-E hello.c -o hello.i

tarena@tarena-virtual-machine:~/day21$ ls

hello.c hello.i

tarena@tarena-virtual-machine:~/day21$ gcc-S hello.i

tarena@tarena-virtual-machine:~/day21$ ls

hello.c hello.i  hello.s

tarena@tarena-virtual-machine:~/day21$ gcc-c hello.s

tarena@tarena-virtual-machine:~/day21$ ls

hello.c hello.i  hello.o  hello.s

tarena@tarena-virtual-machine:~/day21$ gcchello.o -o hello

tarena@tarena-virtual-machine:~/day21$ ls

hello hello.c  hello.i  hello.o hello.s

tarena@tarena-virtual-machine:~/day21$./hello

hello world

 

gcc –vhello.c :-v参数就是将程序从.c文件到可执行文件的这个编译过程全部显示在屏幕上

#include<>  :到系统指定的路径下找头文件,如果找不到,报错。如果找到,就把头文件复制粘贴到程序目前的位置。

#include“ ”  :从当前路径下找头文件,如果没找到,然后到系统指定的路径下去找这个头文件,如果还没找到就报错。

系统指定路径:  gcc –v hello.c

#include "..." 搜索从这里开始:

#include <...> 搜索从这里开始:

 /usr/lib/gcc/i686-linux-gnu/4.6/include

 /usr/local/include

 /usr/lib/gcc/i686-linux-gnu/4.6/include-fixed

 /usr/include/i386-linux-gnu

 /usr/include

.o库文件

/usr/lib/gcc/i686-linux-gnu/4.6/crtend.o

crtbegin.o  /i386-linux-gnu/crtn.o

 

 

#include <stdio.h>

末尾为什么不加分号?因为不是C语句,是一条预处理指令,不参与编译。

 

预处理指令的补充:

在预处理阶段预处理指令发挥作用

#单词   预处理指令

1)宏定义: 只是简单的替换

2)预处理阶段将注释信息全部清楚

3)文件包含

//  指令:mv  文件名   路径   例: mv  hello.c ..

//  sudo命令  :将用户的身份临时切换到root用户,执行该命令完毕,身份自动切换回原用户的身份

4)条件编译

# if 条件

printf ( “hello world”);

#else

printf(“ 123456”);

#endif

 

#ifndef 宏名    //安全卫士   头文件卫士作用:防止重复包含

…….

#define 宏名  

#endif    

 

小结

操作系统

GNU项目  基于unix系统调用编写应用程序   遵循posix C标准

Linux是一款操作系统内核  遵循了posix C 标准

现在所谓说的linux系统,其实是GUN / linux操作系统

用户应用程序、内核程序

标准C库函数和系统调用,寻求帮助的方式 

gcc的一些应用

-E  预处理

-S  编译成汇编语言

-c  汇编成机器语言

.o目标文件与标准库文件链接生成可执行文件

扩展名:

.c 源文件     .h头文件  .s汇编文件   .i预处理后的文件   .o.目标文件

预处理过程

链接过程明天学习

作业:

编写一个函数,实现字符串的拷贝,不允许利用库函数   strcpy()

使用strcpy的原型   man strcpy

char *tstycpy ( char *dest , const char*src)

 

以后着重了解每个函数的原型!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: