![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux下C开发
文章平均质量分 79
Robot__Man
这个作者很懒,什么都没留下…
展开
-
C语言的函数与文件操作
c语言中使用函数对语句进行分组 所有的c语言程序都是由一个或多个的的函数构成的 所有c语言程序中必须有一个叫做main的函数,这个函数叫做主函数 函数之间通过互相调用建立联系,在函数调用过程中主动发起的一方叫调用函数,被动接受的一方叫被调用函数 返回值是一个特殊的变量,函数中使用return语句对返回值变量赋值 调用函数中可以把函数调用语句当数字使用,这个数字就来自于函数的返回值变量,返回原创 2016-06-20 14:28:58 · 633 阅读 · 0 评论 -
进程间通信(IPC) (3)—— 信号量与信号量集
信号量(semaphore)和信号量集(semaphore arrays) 信号量集是由信号量组成的数组,信号量其实就是一个计数器,用于控制 同时访问共享资源的 进程/线程的总数(IPC中的信号量只控制进程)信号量的使用方式: 1.先赋处值,就是 允许并行的进程最大数量。 2.如果有进程访问, 计数-1,到0就阻塞访问进程。 3.如果有进程结束访问,计数 + 1。信号量集就是将多原创 2016-08-17 23:57:42 · 1799 阅读 · 0 评论 -
文件/目录管理(3)---文件其他操作函数及目录操作函数
文件的其他相关函数 标C取文件大小: fseek()到最后 ftell()取得返回值 就是文件的大小。 UC取文件的状态(属性)的函数:stat/fstat,经常用于取文件的大小。 stat函数用字符串表示文件,fstat用文件描述符表示文件。stat函数不需要open()就可以取文件状态stat.c#include <stdio.h>#include <原创 2016-07-04 21:40:26 · 589 阅读 · 0 评论 -
文件/目录管理(2)---dup()/dup2()/lseek()/fcntl()
dup()和dup2()都可以复制文件描述符,区别是: dup()返回的是系统帮忙查找的未使用的最小值 dup2()返回的是第二个参数,如果该值已经被使用,会先关闭然后再使用。 dup() dup2() 复制文件描述符,但不复制对应的文件表。 使用文件描述符时,内存中对应一个文件表,在文件表中,会记录关于内存中文件表的信息和硬盘上的文件的信息,其中,i节点是文件在硬盘原创 2016-06-23 10:07:49 · 528 阅读 · 0 评论 -
内存管理-sbrk()/brk()、mmap()/munmap()
sbrk() brk()底层都维护了一个位置, sbrk(increment) 当 increment 为正时,位置向后移动increment字节,同时返回移动之前的位置,相当于分配内存。 当 increment 为负时,位置向前移动increment字节,相当于释放内存,其返回值没有实际意义。 当 increment 为零时,不移动位置,只返回当前位置。 s原创 2016-06-13 17:11:11 · 1306 阅读 · 0 评论 -
文件/目录管理(1)---open()/close()/read()/write()
文件和目录 在Linux中,几乎一切都被看成了文件。 因此文件操作函数:(系统调用) open()/close()/read()/write()/ioctl() 可以操作几乎所有输入输出设备。open() 打开一个文件 int open(char* filename,int flag,…) filename 表示文件名(带路径) flag原创 2016-06-16 10:46:38 · 681 阅读 · 0 评论 -
进程(2)—— wait()/waitpid()、vfork+exec
进程之间的调度(如何让父进程等待子进程) wait() waitpid()就是进程之间的调度函数 pid_t wait(int* status) 用于 父进程等待子进程的结束,如果父进程有多个子进程的话,等待任意一个子进程结束都会返回。wait的返回值pid_t 可以获取结束子进程的PID,参数status用于 返回结束子进程的状态和退出码。 wait()可以回收僵原创 2016-07-17 19:50:21 · 718 阅读 · 0 评论 -
Linux下C应用编程学习阶段性小项目 —— 模拟银行ATM(单机版)
一 前言程序员的发展道路: 外行->菜鸟->准程序员->程序员->核心程序员(高级)->系统分析师/系统架构师/项目经理–>部门经理/总监(管理职位)–>CTO技术方面的总裁–>自己搞公司从菜鸟到准程序员就是至少要自己独立完成一个小项目。做项目、软件的流程: 1 需求 (要写什么) 2 系统分析 (把客户的要求转成计算机软件系统) 3 系统设计 (设计计算机的软件系统)原创 2016-08-01 22:57:37 · 2018 阅读 · 1 评论 -
C语言的变量域和指针
可以使用某个变量名的所有语句的综合叫这个变量的作用域 每个变量都有它自己的作用域,在函数中的变量,或者函数形参中的变量,都是局部变量,他们的作用域就是当前函数,而全局变量的声明在所有函数之外,全局变量的作用域是程序中的所有语句,在当前程序的各个地方都能访问到,全局变量不初始化的话,系统会自动初始化为0,而局部变量则不确定 块变量声明在某个语句块内部,块变量的作用域是语句块内部的所有语句 在局部原创 2016-06-20 15:18:09 · 1441 阅读 · 0 评论 -
C语言的常用库函数
calloc函数也可以从堆中分配内存,这个函数会对分配好的内存进行清0 realloc函数可以调整堆中分配的内存大小,realloc的调整不一定在原地完成,调整完成后只需要释放新的内存空间 calloc如果调整失败则返回NULL函数指针用来记录代表函数的地址数据,函数指针可以用来直接调用一个函数 把函数声明中的函数名改成指针变量声明就得到函数指针的声明语句,函数名称代表函数的首地址 函数指针原创 2016-06-22 10:52:42 · 602 阅读 · 0 评论 -
C语言的运算符
c语言中可以使用加减乘除(+,-,*,/)以及取余(%)这些操作符 赋值操作符(=)用于对变量赋值,左边必须是变量,右边是可以当成数字使用的内容,赋值操作符的优先级很低,但是比,优先级高 多个赋值操作符从右向左计算 复合赋值操作符(+=,-=,*=,/=),其优先级和赋值操作符的优先级一样 自增,自减运算符(++,–),只能对变量进行操作,两种操作(前操作、后操作)的区别在于操作的时机 前原创 2016-06-20 10:18:41 · 4236 阅读 · 0 评论 -
Linux下的串口编程
本文转载自:http://blog.csdn.net/tigerjibo/article/details/6179291Linxu下的串口编程(二) ---------------------------------------------------------Author :tiger-johnWebSite :bl转载 2015-09-17 20:31:38 · 833 阅读 · 1 评论 -
Some Simple C Programs学习笔记
在网上发现美国宾夕法尼亚州的天普大学一教授Giorgio Ingargiola的一些关于C语言编程的程序,分享学习了一下,thank you,网址:http://www.cis.temple.edu/~ingargio/cis71/code/原创 2015-06-02 23:51:59 · 570 阅读 · 0 评论 -
Linux下C开发实用小技术、好代码总结 —— 银行项目
1 Linux下C语言中预定义的几个调试宏Linux几个调试宏__LINE__ __FILE__ __FUNCTION__ __TIME__ __DATA__这几个宏是编译器内置的,不是在哪个头文件中包含的 直接上最简单的例子就好了,没必要多说。#include <stdio.h>int main(){ printf("The file is %s.\n",__FILE__);原创 2016-09-02 14:46:10 · 3523 阅读 · 0 评论 -
Linux下基于socket和多线程的聊天室小程序
要求:基于TCP编写,一个聊天室最多100人。 客户端: 1、用户需要登录,登录时只需要输入一个昵称即可无需判断昵称是否重复(如果其他功能都ok考虑) 2、用户登录后连接服务器端,进入聊天室 3、用户可以输入聊天信息,也可以收到别人的聊天信息。 4、用户可以用某个特殊单词代表退出聊天室。服务器端: 1、启动服务器,开放端口 2、等待客户端的连接,每连接上一个客户原创 2016-09-07 16:23:00 · 15942 阅读 · 4 评论 -
线程初步(2) —— 线程同步
1 互斥量1.1 线程同步 因为多线程共享进程的资源,在访问共享的资源时,就有可能出现互相覆盖的情况,叫共享数据冲突。解决共享数据冲突的技术叫线程同步,解决方案就是把共享资源的访问代码由并行改为串行,其他代码无所谓。线程同步会降低线程的效率,因此使用时不是范围越大越好。 互斥锁/互斥量就是其中的一种方案。我们可以在访问共享资源时加上互斥锁,访问共享资源结束后释放互斥锁,就可以把并行改为串行原创 2016-09-05 23:47:55 · 455 阅读 · 0 评论 -
线程初步(1)—— 线程的创建、参数和返回值、结束、状态、取消
1线程的概念和特点 网络一般都需要实现代码的并行。代码的并行必须借助多进程/多线程。 主流操作系统中都是支持多进程,而在每个进程的内部,都支持多线程并行。 进程,重量级的,拥有自己独立的内存空间。 线程,轻量级的,不需要拥有自己独立的内存空间,只是额外拥有一个独立的栈。一个进程内存的所有线程共享进程的资源(代码区、全局区、堆、文件目录……)。 进程中支持多线程并行,其中有一个是原创 2016-08-30 15:42:08 · 2041 阅读 · 0 评论 -
socket编程(2)—— 一对多通信
1 一对多模型,TCP的编程步骤服务端: 1、socket()获得一个sockfd。注意第二个参数必须SOCK_STREAM. 2、准备通信地址(必须服务器的) 3、bind()绑定。(开放了端口,允许客户端连接) 4、监听客户端 listen()函数 5、等待客户端的连接 accept(),返回用于交互的socket描述符 6、使用第5步返回sockt描述符,进行读写通信。 7、关闭原创 2016-08-30 15:59:27 · 8568 阅读 · 0 评论 -
socket编程(3)—— UDP协议通信
1 TCP和UDP的区别 TCP传输数据时,采用的是数据流方式。UDP传输数据时,采用的是数据报方式。 TCP是有连接协议(基于连接),在数据传输的整个过程,保持服务器和客户端的连接。会重发一切错误数据,因此可以保证数据的正确性和完整性。 UDP是无连接协议,在数据发送和接收的时候连一下即可,发送/接收完毕就不保持连接。不会重发错误数据,因此UDP有可能丢失数据。2 UDP编程 UD原创 2016-08-30 15:32:20 · 830 阅读 · 0 评论 -
环境表 内存管理-malloc()/free()
所有的环境变量在程序中可以通过环境表获取。 环境表是一个全局变量,类型是字符指针数组,以NULL结束,获取方式: extern char** environ; environ就是环境表的首地址,是全局变量env.c#include <stdio.h>#include <string.h>int main(){ extern char** environ;//全局变量不原创 2016-06-12 20:31:41 · 844 阅读 · 0 评论 -
静态库和共享库(动态库) 动态调用共享库 C的错误处理
程序员找工作的流程: 写简历(差异化)->被通知笔试(背笔试题)->面试(两轮-人力、技术)->等待 由于项目比较复杂,代码数量非常庞大,可以把代码打包成库文件,提供库文件和头文件即可。 库文件分为两种: 静态库 和共享库(动态库),静态库和共享库都是代码的归档文件。使用静态库时,把静态库的代码复制到目标文件中,导致目标文件比较大;使用共享库时,把函数的地址放到目标文件中。原创 2016-06-12 19:30:25 · 2037 阅读 · 0 评论 -
gcc编译过程 常用指令:#warning/#error/#pragma 环境变量 头文件
标准C - 基础,不考虑平台 Unix/Linux下C的开发 - Unix/Linux系统 操作系统: 内存管理、文件/目录管理、进程管理、线程管理、网络支持、信号、IPC进程间通信 学习主要是理论+系统函数,以系统函数应用为主 理论上的东西 尽可能理解,系统函数要求熟练使用。 学习方法: 1 要多花时间和精力,有付出才有收获,付出越多,收获越多。 2 程序员首先做项目,动手是第一原创 2016-06-08 15:08:02 · 5244 阅读 · 0 评论 -
信号(1)
信号就是程序中断的一种方式,属于软件中断。 中断 就是 终止当前的代码,转而执行其他的代码。 中断有软件中断和硬件中断。 Unix/Linux系统中,可以使用信号中断当前代码,转而执行其他的代码。 常见的信号: ctrl+c、ctrl+\、段错误、总线错误、浮点数例外 int/0 浮点数例外(出错,程序被信号中断) double/0 无穷大 (不出错原创 2016-07-17 19:51:55 · 499 阅读 · 0 评论 -
信号(2)
kill() int kill(pid_t pid,int sig); pid 的值 可以是以下4种情况: 大于0 发给进程ID=pid的某个进程 = 0 发给和发送进程同组的所有进程 = -1 发给所有 有发送权限的进程 < -1 发给进程组ID=-pid的进程#include <stdio.h>#include <signal.h>#include <unistd.h>原创 2016-07-21 22:33:57 · 512 阅读 · 0 评论 -
进程间通信(IPC)(1)—— 管道、共享内存
一 有哪些进程间通信方式IPC就是两个或者多个进程之间的数据交互。 IPC的方法: 1. 文件 2. 信号(signal) 3. 管道 4. 共享内存 5. 消息队列(会做一个综合练习) 6. 信号量集(与前面学的信号无关semaphore) 7. 网络编程(socket) …. 二 管道 管道是Unix最古老的I原创 2016-07-21 22:36:25 · 558 阅读 · 0 评论 -
进程间通信(IPC)(2)—— 消息队列
3.2 消息队列 有一个队列,队列中存放各种消息。每个进程都可以把数据封存在消息中,再放入队列。 每个进程都可以拿到消息队列,再从中取出/放入消息。 消息队列不会产生覆盖问题,但需要考虑队列长度。消息队列的编程步骤: 1 生成key,使用ftok()或用头文件定义 2 创建/获取消息队列 msgget() 3 发送/接收消息 msgsnd() / msgrcv原创 2016-07-26 23:23:18 · 502 阅读 · 0 评论 -
socket编程(1)—— 一对一通信(本地IPC和网络)
一 网络基础知识1 OSI七层协议模型 人和计算机之间交互分了7层(OSI 7层模型):物理层、数据链路层、网络层、传输层、会话层、表现层、应用层。 TCP/IP协议模型中,把应用、表现和会话层合并为一个大应用层。2 常见协议HTTP,FTP,TCP,IP,UDP,收发email的协议 HTTP — 超文本传输协议(互联网) FTP — 文件传输协议(上传和下载原创 2016-08-24 17:20:22 · 1973 阅读 · 0 评论 -
C语言的预处理指令
预处理指令是c语言支持的一种特殊指令 它们以#做开头,不以;做结尾 预处理指令在编译的第一个阶段被处理 所有预处理指令都是把程序变成另外的样子 gcc可以使用-E选项单独处理所有预处理指令 “#define”是一个预处理指令,这个预处理指令用来定义宏,宏定义可以给数字起名称 定义宏时不要使用=和; 宏名称中不应该有空格 宏和变量在计算机里的处理方式完全不同 可以在gcc命令行中使原创 2016-06-22 10:50:56 · 2965 阅读 · 0 评论 -
C语言的字符串
数组名称和指针变量的区别 1、数组名称不可以被赋值,指针变量可以被赋值 2、进行sizeof计算时结果不同 3、进行取地址操作结果不同(数组名称取地址得到的数字和原数组名称代表的数字一样,但是新数字被当成二维数组看待) 使用循环操作数组时,可以使用指针变量作为循环变量const关键字也可以用来声明变量,const变量是不可以被修改的(可以通过指针修改) const用来声明指针变量的时候不允原创 2016-06-22 10:47:07 · 466 阅读 · 0 评论 -
C语言结构体、枚举、联合
结构体可以用来把多个不同类型的变量合并成一个整体 结构体是一种数据类型,可以用来声明变量 结构体的声明语法如下: struct 结构体名称 { int id; char name[20]; float salary; }; 大括号内部声明的变量并不会立刻在内存中分配空间 使用结构体声明结构体变量的语法如下: struct person p; 其中struct per原创 2016-06-22 10:51:54 · 500 阅读 · 0 评论 -
C语言的语句和数组
分支语句可以根据情况从多组语句中选择一组执行 if(逻辑表达式1){ //有且只有一个 语句组1 } else if(逻辑表达式2){ //可以没有,也可以有多个 语句组2 } else{ //最多一个,可能没有 语句组3 }switch … case语句也是一种分支语句循环语句可以用来反复执行类似的操作原创 2016-06-20 14:25:23 · 730 阅读 · 0 评论 -
C语言的数据类型
MinGW是windows操作系统里的gcc当输入非法时,使用scanf(“%*[^\n]”);scanf(“%*c”);从而不影响对后面读取数据的影响.关键字后面接空格 函数名后面不要空格 , ;不空格且向前靠拢 && || != == >= <= = + - * / 这些操作符前后都要空格 ++ – [] . -> 前后都不空格 特别注意运行时,scanf的输入格式,空空格,打不打原创 2016-06-16 16:22:25 · 1991 阅读 · 0 评论 -
进程(1)—— 基础理论及fork()
进程 - 一个在内存中运行的程序 主流的操作系统基本都支持 多进程。 Linux中查看进程的方法 ps - 查看本终端启动的进程 ps -aux Linux专用的查看进程 ps -ef Unix/Linux通用的查看进程 显示的东西有所差别,Unix系统不直接支持ps -aux 但/usr/ucb/ps -aux 可以执行。 k原创 2016-07-06 07:45:34 · 779 阅读 · 0 评论 -
Linux下C代码开发中遇到的问题集锦
本文是自己在工作中遇到的一些有关C代码开发中的一些问题的整理。并不完整,但后续可能会继续慢慢的积累。1、复制函数 memcpy是拷贝内存中的区域,不止可以复制字符串,拷贝时不会在末尾添加’\0’。 strcpy只能拷贝字符串,拷贝时会拷贝末尾的终止的空字符,并且遇到’\0’就结束。char *strncpy(char *s1,const char *s2,size_t n); 1)函数st原创 2017-02-22 11:26:04 · 652 阅读 · 0 评论