自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Linux网络编程之实现多方消息收发demo

// 服务端#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <stdlib.h>#include <string.h>int main(int argc, char **argv){ int s_

2021-01-04 19:05:12 206

原创 Linux网络编程之服务端和客户端简单代码的实现

字节序转换apiuint16_t htons(uint16_t host16bitvalue); // 返回网络字节序的值uint32_t htonl(uint32_t host32bitvalue); // 返回网络字节序的值uint16_t ntohs(uint16_t net16bitvalue); // 返回主机字节序的值uint32_tuint32_t ntohl(uint32_t net32bitvalue); // 返回主机

2021-01-04 18:22:58 275

原创 Linux网络编程提供的api简析

1.int socket(int domain, int type, int protocol);返回值:成功返回套接字文件描述符,失败返回-1参数说明:domain:指定所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族)。1)AF_INET:IPv4因特网域;2)AF_INET6:IPv6因特网域;3)AF_UNIX:Unix域;4)AF_ROUTE:路由套接字;5)AF_KEY:密钥套接字;6)AF_UNSPEC:未指定。type:指定socket的类型。1)SOC

2020-12-29 21:31:01 211

原创 socket编程步骤

1.可以用这个场景来理解:2.Socket服务器和客户端的开发步骤:

2020-12-28 22:22:51 199

原创 字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序常见序:Little endian:将低序字节存储在起始地址,称为小端字节序。Big endian: 将高序字节存储在起始地址,称为大端字节序。网络字节序 = 大端字节序。...

2020-12-28 21:40:21 671

原创 Linux网络编程概述

1.TCP/UDP协议对比TCP面向连接 (如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前,不需要建立连接。TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送效率降低(对实时应用很有用,如IP电话,实时视频会议等)。每一条TCP连接只能是点到点的;UDP支持一对一,

2020-12-28 21:18:39 127

原创 线程条件控制实现线程的同步

1.条件操作有5种操作:创建,销毁,触发,广播和等待2.与条件变量相关的api创建和销毁条件变量int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);int pthread_cond_destroy(pthread_cond_t cond);返回值:若成功返回0,否则返回错误编号除非需要创建一个非默认属性的条件变量,否则pthread_cond_init函数

2020-12-25 21:51:04 88

原创 Linux线程什么情况造成死锁

什么是死锁?1)一般情况下,如果同一线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正在被自己占用着的,该线程又被挂起而没有机会释放锁,因此就永远处于挂起等待状态了,这就叫死锁2)另一种:若线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和线程B都永远处于挂起状态了demo:#include <std

2020-12-25 20:58:13 142

原创 线程同步之互斥量加锁解锁

互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞,直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。与互斥锁相关的api1.创建及销毁互斥锁int pthread_mutex_init(pth

2020-12-24 21:26:26 208 1

原创 线程共享内存空间的代码验证

demo:#include <stdio.h>#include <pthread.h>int g_data = 0; void *func1(void *arg){ printf("t1:%ld pthread is creat\n",(unsigned long)pthread_self()); printf("t1:param is %d\n", *((int *)arg)); while(1){ printf("t

2020-12-24 20:25:57 194 1

原创 线程创建等待,退出及线程的应用

相关的api(因为线程的API不是标准C库,所以gcc编译时,后面要加上 -lpthread)1.线程创建**int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn) (void ), void restrict arg);返回值:若成功返回0,否则返回错误编号说明:当pthread_creat成功返回时,由tidp指向的内存单元被设置为新创建线程的线程

2020-12-24 20:12:03 109

原创 线程概述(与进程的区别及线程的优势)

1.进程与线程的区别:典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以吧进程设计成在同一时刻做不止一件事情,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CPU时间,内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令,数据及其组织形式的描述,进程才是程序的真正运行实例。线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际

2020-12-23 21:42:45 218

原创 linux进程间通信之信号量及信号量的应用

信号量概述信号量与已经介绍过的IPC结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据特点:信号量用于进程间同步,若要在进程间传递数据需要结合共享内存信号量基于操作系统的P操作和V操作,程序对信号量的操作都是原子操作每次对信号量的PV操作不仅限于对信号量值加1或减1,而且可以加减任意正整数支持信号量组临界资源:多道程序系统中存在许多进程,它们共享各种资源,如:共享内存,然而有很多资源一次只能供一个进程使用,一次仅允许一个进程使用的资源称为临界资源。许多

2020-12-22 22:46:22 175

原创 Linux 信号(signal)以及信号的应用

信号概述1.对于Linux来说,实际信号是软中断,许多重要的程序都需要处理信号。信号为Linux提供了一种处理异步事件的方法。比如:终端用户输入了ctrl+c来中断程序,会通过信号机制停止一个程序。2.信号的名字和编号:每个信号都有一个名字和编号,这些名字都以"SIG"开头,例如:“SIGIO”,"SIGCHLD"等等信号定义在signal.h头文件中,信号名都定义为正整数具体的信号名称可以用指令 kill -l 来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0

2020-12-21 21:42:05 931

原创 Linux进程间通信之共享内存

共享内存,是指两个或多个进程共享一个给定的存储区1.特点:共享内存是最快的一种IPC,因为进程是直接对内存进行存取因为多个进程可以同时操作,所以需要进行同步信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问2.相关的api<1> int shmget(key_t key, size_t size, int flag);功能:创建或获取一个共享内存返回值:成功返回共享内存的ID,失败返回-1参数说明:key:有两种情况:1)0或IPC_PRIVATE:会

2020-12-18 20:36:49 126 1

原创 Linux中ftok函数介绍

函数原型:*key_t ftok(const char fname, int id);功能:系统建立IPC通讯(如消息队列,共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到返回值:成功返回一个key_t值,失败返回-1参数说明:fname:就是你指定的文件名(已经存在的文件名),一般使用当前目录id:子序号。(虽然为int型,但是只有8个比特被使用,也就是0—255)在一般的UNIX实现中,是将文件的索引节点号去取出(查询文件索引节点号的方法是:ls -i)。前面加

2020-12-18 19:22:18 709

原创 消息队列的通信原理及创建消息队列编程收发数据

1.消息队列,是消息的链接表,存放在内核中,一个消息队列由一个标识符(即队列ID)来标识。2.特点:消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取3.消息队列相关api<1> int msgget(key_t key, int flag);功能:打开或创建消息队列。返回值:成功返回队列ID,失败返回-1

2020-12-17 21:26:16 412

原创 创建命名管道

FIFO,也称命名管道,它是一种文件类型。1.特点:FIFO可以在无关的进程之间交换数据,与无名管道不同FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中2.创建命名管道的函数原型:int mkfifo(const char *pathname,mode_t mode);参数说明:pathname:文件的路径名mode:与open函数中的mode相同。一旦创建了一个FIFO,就可以用一般的文件IO函数操作它返回值:成功返回0,出错返回-1,错误原因存于errno中

2020-12-16 22:11:55 327

原创 管道通信原理

1.进程间通信(IPC)介绍进程间通信(IPC)是指在不同进程之间传播或交换信息IPC的方式通常有管道(包括无名管道和命名管道),消息队列,信号量,共享存储,Socket,Streams等。其中Socket和Streams支持不同主机上的两个进程IPC2.管道管道通常指无名管道,是UNIX系统IPC最古老的形式特点:<1> 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端<2> 他只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程

2020-12-16 21:09:22 785 1

原创 popen函数

**1.函数原型:FILE *popen(const char command, const char type);参数说明:command:是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到/bin/sh并使用 -c标志,shell将执行这个命令type:只能是只读或只写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r",则文件指针连接到command的标准输出;如果type是"w",则文件指针连接到command的标准输入返回

2020-12-13 20:53:28 457

原创 system函数

1.函数原型:*int system(const char command);参数说明:command:外部可执行程序名字返回值:成功,则返回进程的状态值。当在调用/bin/sh时失败则返回127,其他原因失败返回-12.system和exec族函数的区别:调用exec族函数以后,它会代替调用它的程序,执行完成后,不会回到之前的程序中去system函数不同,调用了system之后,之前的程序会等待system的返回,返回之后继续执行之前的程序demo:#include <st

2020-12-13 20:32:09 734

原创 exec族函数配合fork函数使用

实现功能:当父进程检测到输入为1的时候,创建子进程把配置文件的字段值改掉// 文件demo.c#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <stdlib.h>int main(){ pid_t p

2020-12-13 20:09:27 141 1

原创 exec族函数(execl, execlp, execle, execv, execvp, execvpe)

exec族函数的作用:我们用fork函数创建新进程后,经常会在新进程调用exec函数去执行另外一个程序。 当进程调用exec函数时,该进程被完全替换为新程序,因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。功能:在调用进程内部执行一个可执行文件。 可执行文件既可以是...

2020-12-13 19:37:22 281

原创 父进程等待子进程退出

1.子进程退出状态不被收集,此时子进程变成僵死进程(僵尸进程)。2.父进程等待子进程退出,并收集子进程的退出状态*pid_t wait(int status); status参数是一个整型数的指针,如果是非空,子进程退出状态放在它所指向的地址中,如果是空(NULL)则代表不关心退出状态检查wait和waitpid返回的终止状态的宏宏说明WIFEXITED(status)若为正常终止子进程返回的状态,则为真。对于这种情况可执行WEXITSTATUS(status) 取子

2020-12-13 18:12:41 246

原创 进程退出

1.正常退出:main函数调用return进程调用exit(),exit函数是标准C库函数进程调用_exit()或者_Exit(),属于系统调用进程最后一个线程返回最后一个线程调用pthread_exit()2.异常退出:调用abort函数当进程收到某些信号时,如:ctrl+c最后一个线程对取消请求作出响应3.不管进程如何终止,最后都会执行内核中的同一段代码,这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等。对上述任意一种终止情形,我们都希望终止进程能够通知其父进程

2020-12-12 18:48:57 215

原创 vfork创建进程

vfork函数也可以创建进程,返回值与fork的返回值一样,与fork有什么区别呢?区别一:vfork函数直接使用父进程的存储空间,不拷贝。(fork:子进程拷贝父进程的数据段,代码段;vfork:子进程与父进程共享数据段)区别二:vfork函数:保证子进程先运行,当子进程调用exit退出后,父进程才执行。fork函数:父子进程的执行顺序不确定,是由进程调度决定的#include <stdio.h>#include <sys/types.h>#include &

2020-12-12 18:27:31 166

原创 创建新进程的实际应用场景及fork总结

1.fork创建一个子进程的一般目的:一个父进程希望复制自己,使父,子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求,当这种请求到达时,父进程调用fork,使子进程处理此请求,父进程则继续等待下一个服务请求到达。一个进程要执行一个不同的程序。这对shell是常见的情况,在这种情况下,子进程从fork返回后立即调用exec实际应用场景:例如:服务器(Socket)在收到一个连接请求时,创建子进程对接#include <stdio.h>#includ

2020-12-12 17:55:04 698

原创 进程创建发生了什么事?

早期的Linux,调用fork函数以后,是把整个程序的存储空间进行拷贝。后面Linux内核的技术更新,为了提高效率,是以写时拷贝的方式各自拥有一份数据。子进程复制父进程的数据段,栈和堆,父子进程共享正文段。也就是说,对于程序中的数据,子进程要复制一份,但是对于指令,子进程并不复制,而是和父进程共享。(如果子进程对数据段中的变量不做修改时,则采用共享的原则,只有子进程对数据段中的变量进行修改的时候,才会在子进程的地址空间复制一份)#include <stdio.h>#include <s

2020-12-10 19:39:32 251

原创 创建进程函数fork的使用

1.pid_t fork(void);作用:创建一个新的进程返回值:如果调用成功,返回两次。返回值为0,代表当前进程是子进程;返回值为非负数,代表当前进程为父进程。调用失败,返回-1C程序一开始,就会产生一个进程,当这个进程执行到fork()的时候,会创建一个子进程;此时父进程和子进程是共存的,它们俩会一起向下执行C程序的代码;注意:子进程创建成功后,fork是返回两个值,一个代表父进程,一个代表子进程:代表父进程的值是一串数字,这串数字是子进程的ID(地址);代表子进程的值为0#include

2020-12-10 19:16:04 142 2

原创 进程的相关概念

1.什么是程序,什么是进程?有什么区别?程序是静态的概念,例:gcc a.c -o pro,磁盘中会生成pro文件,叫做程序。进程是程序的一次动态执行过程打个比方,把程序和进程的概念跟做菜相比较的话,那么程序就是菜谱,计算机的CPU就是人,相关的厨具则是计算机的其他硬件,整个炒菜的过程就是一个进程。2.如何查看系统中有哪些进程?使用 ps 指令查看实际工作中,配合 grep 来查找程序中是否存在某个进程。ps -aux(查询内存中进程信息),ps -aux|grep init(查询init进

2020-12-10 18:31:58 77

原创 文件其他函数(fputc,feof,fgetc)讲解及demo

相关函数API*1.int fputc(int c, FILE stream);参数说明:c :要写入的字符stream:文件指针返回值:如果成功的将字符写入到文件了,则其返回值就是写入的这个字符,如果失败,则返回 EOF。EOF是一个符号常量,在stdio.h中 EOF 被定义为 -1,因此见到EOF把它当做 -1 就行了#include <stdio.h>#include <string.h>int main(){ FILE *fp;

2020-12-09 19:46:07 210

原创 标准C库写入结构体到文件

demo:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>struct Test{ int a; char c;};int main(){ FILE

2020-12-09 19:20:07 77

原创 标准C库打开创建文件,读写文件,光标移动

相关函数API**1.FILE *fopen(const char path, const char mode);参数说明:path:文件名,是一个无类型的指针mode:打开模式,是一个指针,必须要用双引号。有:r(只读方式打开一个文本文件),rb(只读方式打开一个二进制文件),w(只写方式打开一个文本文件),wb(只写方式打开一个二进制文件),a(追加方式打开一个文本文件),ab(追加方式打开一个二进制文件),r+(可读可写方式打开一个文本文件),rb+(可读可写方式打开一个二进制文件),w+(

2020-12-09 19:09:46 450

原创 标准C库对文件操作引入

open 与 fopen的区别:1.来源从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别 :open 是 UNIX 系统调用函数(包括Linux等),返回的是文件描述符,它是文件在文件描述表里的索引fopen 是 ANSIC 标准中的 C 语言库函数,在不同的系统中应该调用不同的内核api,返回的是一个指向文件结构的指针2.移植性fopen 是 C标准函数,因此拥有良好的移植性;而 open 是 UNIX系统调用,移植性有限。如 windows下相似的功能使用API函数cre

2020-12-09 18:14:53 216

原创 写一个整数和一个结构体数组到文件

1.写一个整数到文件#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main(){ int fd; int data = 100; int dat

2020-12-08 18:52:38 132

原创 文件编程小应用之修改程序的配置文件

例:配置文件的修改1.解题思路:找到 a 位置a 往后移,移到 b修改 b 位置的内容2.demo:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>int main(in

2020-12-08 18:32:51 103

原创 文件操作小应用之实现 cp 指令

例:cp src.c des.c1.C语言参数:int main(int argc,char *argv[])2.编程思路:打开 src.c 文件把 src.c 文件的内容读到 readBuf 里创建 des.c 文件将 readBuf 的内容写入到 des.c 文件关闭 src.c 文件和 des.c 文件3.demo:#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h&gt

2020-12-08 18:01:15 200

原创 文件操作原理简述

文件描述符:1.对于内核而言,所有打开文件都由文件描述符引用,文件描述符是一个非负整数,当打开一个现存文件或创建一个新文件时,内核进程返回一个文件描述符。当读写一个文件时,用 open 或 creat 返回的文件描述符标识该文件,将其作为参数传递给 read 和 write。按照惯例,UNIX shell 使用文件描述符 0 与进程的标准输入相结合,文件描述符 1 与标准输出相结合,文件描述符 2 与标准错误输出相结合。STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO 这

2020-12-07 19:27:31 115

原创 文件打开创建的补充

函数介绍:*int creat(const char pathname, mode_t mode);参数说明:pathname:要创建的文件名(包含路径,缺省为当前路径)mode: 创建模式,常见的创建模式有:S_IRUSR(可读),S_IWUSR(可写), S_IXUSR(可执行),S_IRWXU(可读可写可执行)返回值:返回一个文件描述符demo:#include <sys/types.h>#include <sys/stat.h>#includ

2020-12-07 18:32:35 66

原创 文件打开,创建,读写操作及光标移动操作

相关函数API1.int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);参数说明:pathname:要打开的文件名(含路径,缺省为当前路径)flags:权限,有3个参数可供选择 O_RDONLY 只读打开,O_WRONLY 只写打开, O_RDWR 可读可写打开当我们附带了权限后,打开的文件就只能按照这种权限来操作以上这3个常数中应当

2020-12-07 18:09:13 127

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除