学习笔记--《C语言编程语言入门》 linux下c语言编程

FROM Linux公社 http://linux.linuxidc.com

因为了解WIFI安全,看到BT5,从而接触到Linux公式。非常感谢Linux公社的公共资源,这真是一个知识的宝库。

常在linux下进行嵌入式开发,出了校门真正应用还未系统的学习。借项目间隙,学习一下,望能温故而知心。

第一章 基础知识

源程序编译:使用gcc编译器,主要了解 -o -c -g选项,可以在terminal 输入man gcc查看原文档。

Makefile的编写: 这是一个工程的组织架构,当gcc的东西多了,需要库和链接时就需要这么一个配置文件进行组织。可以查《和我一起写Makefile》系统学习。

程序库的链接:gcc 缺省会链接常用的库(/lib  / usr/lib  /usr/local/lib);需要特定库时可以使用-L/home/hoyt/mylib 进行链接;关于动态库和静态库需要专门查找学习。

程序的调试: 可以使用gdb工具(gcc编译添加 -g选项),也可以程序中打印变量或输出日志文件的方式。各取所好,方便自己就好。

头文件和系统求助: 找不到时,可以使用man找到具体的用法和所在头文件。 man write 是write命令的说明; man 2 write是系统调用函数; man 3 write 是C的库函数。

第二章 进程介绍

进程的概念 :进程是系统执行程序而产生的,系统会分配个ID给它。因为系统的多用户并行执行从而有了进程的新建、运行、阻塞、就绪和完成五个状态。具体参照《操作系统》。

进程的身份: 用户执行程序,程序分出若干子孙进程,进程需要一定资源。 可以通过getpid();getppid();getuid();geteuid();getgid();getegid()得到进程ID;父进程ID;用户ID;有效用户ID;组ID;有效组ID等。

进程的创建: fork();函数可以克隆出一个进程,这个子进程只有ID与自己不同。如果父进程希望阻塞等待可以调用wait();waitpid(); 子进程若调用系统程序可以使用.exec族的5个函数。具体参考 man execl。

守护进程的创建 :守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。对于后台执行,我么可以在命令后加&,Shell会将程序放到后台运行。而对于编码,可以由父进程创建子进程后,子进程将父进程杀死。子进程就可以定时后台执行了。

第三章 文件操作

文件的创建和读写:文件的创建、打开、读取、写入、关闭等动作:fd=open(path,flag,mode);close(fd);read(fd...);write(fd...);

文件的各个属性:判断文件是否可以进行某些操作---access(); 若果需要其它的属性---stat:未打开的文件; fstat:打开的文件。

目录文件的操作:获得当前目录getcwd(buf,size);  还可以创建、打开、读取、重读、关闭目录等动作。

管道文件:linux提供了许多过滤和重定向程序,比如cat  more 。还提供了》《><|等重定向操作符。都会用到管道文件。系统调用pipe()可以创建一个管道,也是个缓冲区。重定向fd可以使用dup2();

第四章 时间概念

时间的表示: time():返回1970.1.1开始以来的秒数;ctime():将秒数返回成26长度的字符串时间。

时间的测量:比如要测量程序执行的时间:可以使用gettimeofday()获取两次求差。

计时器的使用:Linux操作系统为每个进程提供了3个内部间隔计时器: ITIMER_REAL  ITIMER_VIRTUAL  ITIMER_PROF

第五章 信号处理

信号的产生:一个来源是硬件(如键盘按下);另一个是软件(系统函数或命令),最常用的4个发出信号的系统函数:kill 、 raise 、alarm 、 setitimer。

信号的处理:操作有:信号集合清空、填满;将信号从集合删除、添加进去;判断是否在集合中;将信号集合加入到进程的信号阻塞集合中。阻塞的信号处理与反馈sigaction()。

其他信号函数:pause();挂起直到信号到来。还有一些: sigsuspend();sigsetjmp();siglongjmp();

一个实例:不赘述。

第六章 消息管理(进程通信IPC)

POSIX无名信号量:信号量的使用主要是用来保护共享资源临界资源,使得资源在一个时刻只有一个进程所拥有。操作函数有sem_init();destroy();wait();trywait();post();getvalue(); -lrt librt.so库。

System V信号量:ftok();semget();semctl();semop();sembuf{};

System V消息队列:对消息队列的操作。msgget();msgsnd();msgrcv();msgctl();

System V共享内存:shmget();shmat()-connect;shmdt()-disconnect;shmctl();

进程通信(IPC)是网络程序的基础,在很多的网络程序当中会大量的使用进程通信的概念和知识。其实进程通信是一件非常复杂的事情,学习它最好的办法是不对的写程序和看联机手册。

第七章 线程操作

我们编写的程序大多数可以看成是单线程的,就是程序是按一定的顺序来执行。如果我们使用线程的话,程序就会在我们创建线程的地方分叉,编程两个程序在执行。粗略的看来好像和子进程差不多的,其实不然。子进程是通过拷贝父进程的地址空间来执行的,而线程是通过共享程序代码来执行的。通俗一点就是线程的相同的代码会被执行几次,使用线程的好处是可以节省资源,由于线程是通过共享代码的,所以没有进程调度那么复杂。

线程创建和基本的使用:pthread();  *(*start_routine)(); pthread_exit();pthread_jion(); gcc  need  lib  :-lpthread   例子有些小问题。

线程属性:不详

线程互斥:不详

线程同步;不详

第八章 网络编程

1、Linux网络知识介绍

      网络程序和普通程序区别是由两个部分组成:客户端和服务器。先有服务器建立起来,客户端再去连接对应端口。

      常用命令:netstat-显示网络连接、路由表、接口统计等网络信息,常用选项-an。telnet-查看服务器端telnet localhost 8888。

      基于TCP/IP协议两种形式通信: TCP  、  UDP。

2、初等网络函数介绍

      socket编程具有设备无关性。

      socket() -- 创建fd。AF_UNIX针对UNIX系统进程间通信,AF_INET针对网络间通信;SOCK_STREAM是TCP协议,SOCK_DGRAM是UDP协议。

      bind() --  绑定fd和本地端口。struct sockaddr{...} 在linux/socket.h中,为了系统兼容,我们使用linux/in.h的 struct sockaddr_in{...}。

      listen() -- 将bind的fd变为监听套接字。

      accept() -- 服务器端接收一个连接。

      connect() -- 客户端用来连接服务器。

                       服务器端: socket --> bind --> listen --> accept

                       客户端    : socket -->connect

3、服务器和客户端的信息函数

      字节转换函数: htonl  htons  ntohl  ntohs           h: host      n: net     s:short    l: long

       IP和域名的转换 : gethostbyname()     gethostbyaddr()     需要理解netdb.h中 struct hostent结构体。  h_strerror()可以得到出错信息。

      字符串IP 和 32位hexIP  转换 :inet_aton()    inet_ntoa()     a: ascii    n:network

      服务信息函数:getsockname();    getpeername();   getservbyname();   getservbyport();   较少使用。

4、完整的读写函数

      write() -- 返回值>0,表示写入了部分或全部数据; 返回值<0,表示错误,可以通过errno得知。

      read() --  >0,表示实际读取字数;=0,表示文件读取结束;<0,表示错误。如果为EINTR表示中断导致。

5、用户数据报发送

      针对UDP协议数据通信:

      recvfrom();   sendto();

6、高级套接字函数

      recv();    send()   的前三个parameters和 read()  write()一样,可是增加了第四个参数 来控制读写操作。

      recvfrom();   sendto()   UDP协议使用。

      recvmsg();    sendmsg();  可以实现以上四个函数的所有功能。

      close();shudown();    close(fd)时和我们关闭文件一样。 shutdown()可以定制关闭读或者写通道。

7、TCP/IP协议

      分层的网络协议。从上到下:应用层(app)、表示层(ssl)、会话层(socket)、传输层(TCP/UDP)、网络层(IP  ICMP)、数据链路层和物理层(802.3  802.11);

      根据实际主要了解802.11   IP   ICMP  TCP UDP SSL。。。

8、套接字选项

      sometimes 我们需要控制套接字的行为,需要函数:   getsockopt();  setsockopt(); 

       可以控制通用套接字、IP选项、TCP选项三种。  SOL_SOCKET   IPPROTO_IP   IPPROTO_TCP。

       ioctl可以控制所有的文件描述符的情况。  man ioctl_list。

9、服务器模型

       循环服务器:循环服务器在同一时刻只响应一个客户端的请求。 UDP服务器从套接字上读取请求,处理后返回给客户端;TCP服务器接受一个客户端连接,处理后断开连接。

       并发服务器:并发服务器在同一时刻可响应多个客户端的请求。 TCP服务器,每个客户机的请求并不由服务器直接处理,而是服务器创建fork()一个子进程(太耗资源)来处理。多路I/O复用,即select形式(耗时)使用。 UDP并发服务器,fork子进程处理,除非服务器在处理用户数据时用时较长,否则很少用这个模型。

10、原始套接字

      区别于 SOCK_STREAM和SOCK_DGRAM, 还有原始套接字SOCK_RAW。 这个是root权限才可以创建的套接字。         可以使用原始套接字实现DOS小程序。没看明白最后例子中为什么使用sendto....

第九章 Linux下C开发工具介绍

GNU C编译器: gcc

使用GCC  : gcc [options]  [filenames]

GCC选项  : 有100多个 。 常用 -o  -llib  -g  -pg(产生剖析信息及耗时情况等)等,可以 man gcc。

优化选项   : 编译时为了易于调试,自动情况下是没有经过优化的,如果需要优化可以使用-O  -O2选项。 gcc 可以同时使用 -g -O使我们在最优化的情况下调试,更接近实际。

用gdb调试gcc程序 :gdb <fname>   ;    gdb -h 可以得到一些选项的简单说明。

gdb基本命令:   包括: file  kill  list  net step  run  quit  watch  printf break  make  shell等,支持Tab键补全和上下键翻页历史。gdb filename core,查看产生的core dump;

其他工具 :    xxgdb是gdb基于 X Windows图形界面工具。

                      calls  calltree可以输出源文件里的函数调用树图。

                       cproto读入C源程序文件并自动为每个函数产生原型申明,可以输出为头文件。

                       indent  自动缩进代码的工具。

                       gprof   剖析程序从而知道那个部分在执行时最费时。可以显调用次数。

暂时时学习到这

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
linux C语言 网络编程教程及源码 一、网络应用层编程 1、Linux网络编程01——网络协议入门 2、Linux网络编程02——无连接和面向连接的区别 3、Linux网络编程03——字节序和地址转换 4、Linux网络编程04——套接字 5、Linux网络编程05——C/S与B/S架构的区别 6、Linux网络编程06——UDP协议编程 7、Linux网络编程07——广播 8、Linux网络编程08——多播 9、Linux网络编程09——TCP编程之客户端 10、Linux网络编程10——TCP编程之服务器 11、Linux网络编程11——tcp、udp迭代服务器 12、Linux网络编程12——tcp三次握手、四次挥手 13、Linux网络编程13——connect()、listen()和accept()三者之间的关系 14、Linux网络编程14——I/O复用之select详解 15、Linux网络编程15——I/O复用之poll详解 16、Linux网络编程16——I/O复用之epoll详解 17、Linux网络编程17——tcp并发服务器(多进程) 18、Linux网络编程18——tcp并发服务器(多线程) 19、Linux网络编程——tcp高效并发服务器(select实现) 20、Linux网络编程——tcp高效并发服务器(poll实现) 21、Linux网络编程——tcp高效并发服务器(epoll实现) 二、网络底层编程(黑客模式) 1、Linux网络编程1——啥叫原始套接字 2、Linux网络编程2——原始套接字编程 3、Linux网络编程3——原始套接字实例:MAC头分析 4、Linux网络编程4——原始套接字实例:MAC地址扫描器 5、Linux网络编程5——IP数据报格式详解 6、Linux网络编程6——TCP、UDP数据包格式详解 7、Linux网络编程7——原始套接字实例:发送UDP数据包 8、Linux网络编程8——libpcap详解 9、Linux网络编程9——libnet详解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值