Linux程序设计 读笔1

第一章 入门

Linux应用程表现为两种特殊类型文件:可执行文件 + 脚本文件

/bin             二进制文件目录,存放启动系统时用到的标准程序

/usr/bin           用户二进制文件目录,存放用户使用的标准程序

/usr/local/bin         本地二进制文件目录,存放软件安装的程序

/sbin和/usr/sbin       root用户使用,存放系统管理程序

/opt             存放可选的操作系统组件和第三方应用程序

第一个Linux程序:Hello World程序

hello.c

#include<stdio.h>
#include<stdlib.h>

int main(){

  printf( "Hello World\n" );
  exit(0);
}

gcc -o hello hello.c

./hello 即可运行打印Hello World

Linux开发时一些重要的目录和文件介绍:

1 应用程序

一般在 /usr/bin 、/usr/local/bin、/opt中

2 头文件

一般在 /usr/include中

编译时可以使用-I标志来包含保存在子目录或者非标准位置中的头文件,如:gcc -I/usr/openwin/include fred.c

可以用grep命令搜索包含某些特定关键字的文件,如 grep EXIT_ *.h  在当前目录下所有以.h结尾的文件中搜索字符串EXIT_

3 库文件

库是一组预先编译好的函数的集合。   标准库文件一般位于/lib 和 /usr/lib中

库文件名字总是以lib开头,随后的部分指明是什么库(c代表C语言库,m代表数学库)。文件名的最后部分以.开始,然后给出库文件的类型:

  .a 代表 静态库

  .so 代表 共享库

可以通过给出完整的库文件路径名或用-l标志来告诉编译器要搜索的库文件:

  gcc -o fred fred.c /usr/lib/libm.a 等价于

  gcc -o fred fred.c -lm (-lm是简写方式,代表的是标准库目录中名为libm.a的函数库)

可以通过-L标志为编译器增加库的搜索路径:

  gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11    这条命令用/usr/openwin/lib目录中的libX11库来编译和链接程序x11fred

4 静态库

也称为归档文件,惯例一般以.a结尾

实验:创建自己的静态库,包含两个函数,然后在一个示例程序中调用其中的某一个函数

步骤1:为两个函数分别创建自己的源文件fred.c和bill.c,内容分别为:

fred.c

#include<stdio.h>

void fred( int arg ){

    printf( "fred: we passed %d\n", arg );
}

bill.c

#include<stdio.h>

void fred( char* arg ){

    printf( "fred: we passed %s\n", arg );
}

步骤2:分别编译这些函数以产生要包含在库文件中的目标文件

  gcc -c bill.c fred.c    -c选项是阻止编译器创建一个完整的程序,当然此时即使试图创建一个完整的程序也不会成功,因为fred.c和bill.c中尚未定义main函数

  此时当前目录下将会多两个文件 bill.o fred.o

步骤3:为库文件创建一个头文件

  起名lib.h(随便起的名字),lib.h将声明库文件中的函数签名。同时将lib.h包含在源文件fred.c和bill.c中是个好主意

  lib.h中内容如下:

    void bill( char* );

    void fred( int );

步骤4:编写调用bill函数的源程序program.c

#include<stdio.h>
#include"lib.h"  //包含库的头文件!!!

int main(){

    bill( "Hello World" );
    exit(0);
}

步骤5:编译并测试program.c了

  gcc -c program.c

  gcc -o program program.o bill.o

  ./program    输出: bill: we passed Hello World

步骤6:创建并使用一个库文件

  使用ar归档命令创建一个归档文件并将你的目标文件添加进去:

    ar crv libfoo.a bill.o fred.o    将两个目标文件使用ar命令归档到一个名为libfoo.a的静态库中去

步骤7:为函数库生成一个内容表(该步骤一般不需要,但做了也无妨),使用ranlib命令

  ranlib libfoo.a

至此为止,自己的库创建好了,可以如下使用:

gcc -o program program.o libfoo.a(或者写成gcc -o program program.c libfoo.a 或者写成  gcc -o program program.c -L. -lfoo 或者写成 gcc -o program -L. program.c -lfoo, -L.表示当前目录!

./program

时间: 2024-12-22 22:28:42

Linux程序设计 读笔1的相关文章

Linux程序设计 读笔3 文件操作

一 linux文件结构 二 系统调用和设备驱动程序 三 库函数 四 底层文件访问 五 标准IO库 六 格式化输入输出 七 文件和目录的维护 八 扫描目录 九 错误处理 十

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Linux程序设计学习笔记----网络通信编程API及其示例应用

转载请注明出处, http://blog.csdn.net/suool/article/details/38702855. BSD Socket 网络通信编程 BSD TCP 通信编程流程 图为面向连接的Socket通信的双方执行函数流程.使用TCP协议的通信双方实现数据通信的基本流程如下 建立连接的步骤 1.首先服务器端需要以下工作: (1)调用socket()函数,建立Socket对象,指定通信协议. (2)调用bind()函数,将创建的Socket对象与当前主机的某一个IP地址和TCP端口

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

Linux程序设计学习笔记----System V进程间通信(信号量)

关于System V Unix System V,是Unix操作系统众多版本中的一支.它最初由AT&T开发,在1983年第一次发布,因此也被称为AT&T System V.一共发行了4个System V的主要版本:版本1.2.3和4.System V Release 4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如"SysV 初始化脚本"(/etc/init.d),用来控制系统启动和关闭,System V Interface Definitio

Linux程序设计学习笔记----进程间通信——管道

转载请注明出处: http://blog.csdn.net/suool/article/details/38444149, 谢谢! 进程通信概述 在Linux系统中,进程是一个独立的资源管理单元,但是独立而不孤立,他们需要之间的通信,因此便需要一个进程间数据传递.异步.同步的机制,这个机制显然需要由OS来完成管理和维护.如下: 1.同一主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue)和共享内存(Share Memory).无名管道多用于亲

linux程序设计——进程和信号(第十一章)

11.4.1    发送信号 进程可以通过调用kill函数向包括它本身在内的其他进程发送一个信号.如果程序没有发送该信号的权限,对kill函数的调用就将失败,失败的常见原因是目标进程由另一个用户所拥有.这个函数和同名的shell命令完成相同的功能,它的定义如下所示: #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); kill函数把参数sig给定的信号发送给参数pid给出的进程号所指定的进

7)Linux程序设计入门--网络编程

8)Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个人处 于不败之地,学习Linux的网络编程,可以让我们真正的体会到网络的魅力. 想成为一 位真正的hacker,必须掌握网络编程技术. 现在书店里面已经有了许多关于Linux网络编程方面的书籍,网络上也有了许多关于 网络编程方面的教材,大家都可以 去看一看的.在这里我会和大家一起来领会Linux网

6)Linux程序设计入门--消息管理

6)Linux程序设计入门--消息管理 前言:Linux下的进程通信(IPC) Linux下的进程通信(IPC) POSIX无名信号量 System V信号量 System V消息队列 System V共享内存 1.POSIX无名信号量 如果你学习过操作系统,那么肯定熟悉PV操作了.PV操作是原子 操作.也就是操作是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面 执行.在系统当中,有时候为了顺利的使用和保护共享资源,大家提出了信号的概念. 假设 我们要使用一台打印机,如果在同一