![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络编程
文章平均质量分 64
C后台开发从入门到就业
这个作者很懒,什么都没留下…
展开
-
system()函数
int system(const char *command);int system(Shell字符串)头文件:#include 返回值:-1失败127无法启动shell来运行其他命令退出码特点:一次调用,一次返回。本质:直接用shell执行命令/程序例子:system(“ls”);运行程序与在屏幕输入ls效果一样。原创 2017-05-10 17:31:45 · 225 阅读 · 0 评论 -
进程间通信时读写阻塞的条件
匿名管道(pipe,dup,popen)和套接字(socketpair)中的读写操作:只能亲缘间实现通信命名管道(fifo)中的读写操作:建立管道文件,通过管道文件进行通信。可实现非亲缘间的通信。转载 2017-05-16 19:22:21 · 967 阅读 · 0 评论 -
用管道或套接字实现客户端服务器模型
图示模型: 主要步骤:1.客户端获取文件路径,发送到服务器。2.服务器接收到文件路径,并且读取到文件内容,在发送回客户端。3.客户端接收文件内容,并显示到控制台。代码:使用两个FIFO实现客户服务器模型:client:#include #include #include #include #include #in原创 2017-05-17 15:05:55 · 468 阅读 · 0 评论 -
system V 消息队列(msg)
头文件:sys/msg.h查看:ipcs命令结构体:自定义消息缓冲区结构msgbuf:mtype:消息类型(必须是long型;必须是结构体第一个变量)。mtext:消息数据(可以随意定义)。例子:struct msgbuf{ long mtype;/* must > 0 */ char mtext;/* dat原创 2017-05-18 10:11:02 · 1765 阅读 · 0 评论 -
fork()函数
pid_t fork();完全拷贝一份内存与数据到子进程。父进程和子进程同时运行。返回的0为子进程;父进程返回子进程的PID。谁能最先抢到CPU不确定。返回值:-1:失败。0:子进程逻辑控制流。其他(返回值为子进程的PID):父进程逻辑控制流。本质:复制+分叉。特点(4):1.调用一次,返回两次。2.会额外分出一个相同但是独立的地址空间。3.并发执行。并发:两个或者多个进程在同时存在。 进程指令...原创 2017-05-10 15:45:32 · 268 阅读 · 0 评论 -
exec()函数
分类:字符串数组参数:execv()execvp()execve()可变参数(printf()为典型的可变参数):execl()execlp()execle()其中:字符含义v 第二个参数是数组l 第二个参数之后是变参p 第一个参数是文件名(否则要传路径)e 最后一个参数是环境变量PS:传变参时,最后一个参数填0表示变参结束,变参原创 2017-05-10 17:19:21 · 268 阅读 · 0 评论 -
POSIX消息队列(mq_)
头文件:mqueue.h库:rt--------librt.so编译的时候加-lrt查看POSIX消息队列所有函数:man mq_overview结构体:struct mq_attr{mq_flags;——标志:————在mq_open时被初始化;————在mq_setattr中设置;————其值为0(阻塞)或者O_NONBLOCK(非阻塞)。原创 2017-05-17 17:29:48 · 7818 阅读 · 0 评论 -
读写锁
作用:(实现文件的读写同步)当一个进程正在读或修改文件的某个部分时,阻止其他进程修改同一文件区。访问操作:写入锁——又叫排它锁读取锁——又叫共享锁多进程访问(同一个进程访问只会覆盖已有的锁)已存在锁 读取锁 写入锁无 OK OK读取锁 OK NG写入锁 NG NG同一个进程访问只会覆盖已有的锁在访问之前尝试加锁可以知道文件是否正在被读写。加锁区域:文件锁—原创 2017-06-01 14:35:05 · 457 阅读 · 0 评论 -
多线程编程
概念:进程内的一个执行单元,执行的一段程序片段。共享全局变量。(和主函数同时执行的子函数就是一个线程)(hello world程序,可以说是一个进程,也可以说是一个线程)。参考手册:man 7 threads查看线程:命令:ps -T -p ————查看该pid的线程top -H -p ————开启线程查看htop——设置:F2(开启“树状视图”查看原创 2017-06-01 17:18:07 · 265 阅读 · 0 评论 -
IO复用
概念:多路网络连接复用一个IO线程。如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事。如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了。由于I/O多路复用是在单一进程的上下文中的,因此每个逻辑流程都能访问该进程的全部地址空间,所以开销比多进程低得多;缺...原创 2017-06-28 12:56:34 · 541 阅读 · 0 评论 -
socket 中 TCP 和 UDP 编码流程
TCP socket:Server:listenfd = socket()struct sockaddr_in //内部数据必须是网络序sin_familysin_addrsin_portbind(listenfd)listen(listenfd,backlog)connfd = accept(listenfd,...) // 阻塞read(conn原创 2017-06-28 23:17:10 · 1439 阅读 · 0 评论 -
线程的信号量
创建:int sem_init(sem_t* sem,int pshared,unsigned int value);sem————信号量对象。pshared——信号量类型:0为线程共享;value———初始值。返回值———0成功,-1失败。销毁:int sem_destroy(sem_t* sem);返回值————0成功,-1失败。阻塞等待:int原创 2017-06-08 10:45:58 · 402 阅读 · 0 评论 -
线程间的互斥量和条件变量
互斥锁:PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期!静态分配互斥量:pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;动态分配互斥量:pthread_mutex_init(&mutex,NULL);pthread_mutex_destroy(&mutex);mutex————互斥锁。加锁:int pt原创 2017-06-08 11:18:32 · 286 阅读 · 0 评论 -
线程间的读写锁
共享独占:读取锁——共享写入锁——独占即:读锁可以加多个;有写锁时,读写锁都加不上;有读锁时,可以加读锁而不能加写锁。静态分配读写锁:pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;动态分配读写锁:pthread_rwlock_init(&rwlock,NULL);pthread_rwlock_destro原创 2017-06-08 11:46:40 · 363 阅读 · 0 评论 -
线程池编程
概念:为什么————频繁创建和销毁线程浪费CPU资源。是什么————一堆线程放在一个池子里统一管理。流程:1.初始化线程池、任务队列和工作线程。2.向任务队列中添加任务。3.将等候在条件变量(任务队列上的任务)上的一个线程唤醒并从该任务队列中取出第一个任务给该线程执行。4.等待任务队列中所有任务执行完毕。5.关闭线程池。工作原理:1.首先,建立一个用来存放需原创 2017-06-30 10:29:22 · 316 阅读 · 0 评论 -
socket接口转换操作(网络序与主机序)
字节序转换操作:头文件:网络序转主机序:unit 16_t ntohs(unit16_t net_short);network to host short。把unsigned short类型从网络序转换到主机序。unit 32_t ntohs(unit32_t net_long);network to host long。把unsign原创 2017-06-14 23:01:16 · 1688 阅读 · 0 评论 -
套接字(全双工)实现进程间通信
特点:sv【0】和sv【1】可读可写。每个进程固定用一个接口。写数据时:通道不满不阻塞;读数据时:通道里没数据时阻塞。可用fcntl设置为非阻塞。创建:int socketpair(int domain, int type, int protocol, int sv【2】);参数:domain:套接口的域:AF_LOCAL--------现在用法AF_UNI原创 2017-05-16 19:09:42 · 1361 阅读 · 0 评论 -
systemV信号量
头文件:sys/sem.h查看:ipcs信号量获取:int semget(key,nsems,semflg);key:命名信号量。IPC_PRIVATE 和 ftok()两种方式。nsems:信号量数目。非0——新建的信号量的数量。0———获取信号量(打开时填0)semflg:IPC_CREAT————————创建信号量,已存在时不出错(创原创 2017-05-24 17:12:56 · 376 阅读 · 0 评论 -
进程基本概念
进程概念:程序在计算机上的一次执行过程。即进行中的程序。进程和程序的区别:进程:是活的,动态的。有生命周期。只能对应一个程序。程序:是死的,静态的。指令的集合。可以对应多个进程。进程的状态:就绪:进程已获得除CPU以外的所有必要的资源; 获得CPU立即执行。运行:程序正在CPU上执行。阻塞:等待某个事件发生而无法执行时; 放弃CPU。linux原创 2017-05-10 15:17:03 · 167 阅读 · 0 评论 -
停止进程的方法(waitpid)
方法:1.休眠2.暂停3.等待休眠---->int sleep(unsigned int secs);secs:指定休眠的秒数。-1为永久休眠。返回值:未休眠的秒数。特性:如果没有信号中断(任意信号即可中断sleep),休眠制定秒数后返回0,否则马上返回为休眠的秒数。暂停--->int pause();返回值:总是-1.特性:1.等待信号原创 2017-05-10 18:13:18 · 800 阅读 · 0 评论 -
文件描述符 与 文件流 的关系
文件描述符文件流数据 int整数 FILE指针标准 POSIX ANSI C打开 openfopen关闭 close fclose读 read fread写 write fwrite定位 lseekfseek文件流是文件描述符之上的封装。文件流通过增加缓冲区减少读写系统调用次数来提高读写效率。在进程的用户空间封装的FILE结构,以提高原创 2017-05-11 17:27:31 · 946 阅读 · 0 评论 -
匿名管道 与 命名管道/FIFO管道 的特点
匿名管道:必须是亲缘进程之间。写不会阻塞;读会阻塞。命名管道:可以是非亲缘进程之间。读写必须同时执行,否则阻塞。原创 2017-05-12 11:39:36 · 769 阅读 · 0 评论 -
FIFO管道/命名管道(半双工)
特点:可以是非亲缘进程之间;读写必须同时进行,否则阻塞。创建命名管道:int mkfifo(pathname,mode);参数:pathname:文件路径(文件必须不存在)。mode:模式。返回值:0成功非0失败创建FIFO管道代码:#include #include #include #include int main()原创 2017-05-12 11:41:14 · 1502 阅读 · 0 评论 -
getopt()函数(分析命令行参数)
头文件:#include 函数形式:int getopt(int argc, char* argv【】, const char* optstring);功能:getopt直接分析命令行参数,找到选项和选项参数以及操作数的准确位置。参数:optstring:optstring里存放需要识别的选项字符(如果该选项有参数,则后面加冒号)。argc:命令行字符串个数原创 2017-05-12 14:43:36 · 739 阅读 · 0 评论 -
匿名管道 中的 单工通道(popen)
本质:启动shell和命令两个进程,从命令进程中读/写文件流。解决exec和system无返回输出数据问题。特点:方便使用系统自带功能,并可以执行比较复杂的shell。默认启动两个进程,效率较低。操作:打开管道:FILE* popen(const char *command, const char *open_mode);参数:command:命令行字符原创 2017-05-11 16:48:51 · 608 阅读 · 0 评论 -
匿名管道中的 半双工管道(pipe)
创建管道:int pipe(int filedes[2]);参数:filedes【1】:读filedes【2】:写PS:小口诀:零度以下(0读1写)。返回值:-1失败0 成功关闭管道:close(filedes);PS:要把两个管道都关闭,即创建一次,关闭两次:close(fb【0】);close(fb【1】);写操作:原创 2017-05-11 17:31:18 · 1139 阅读 · 0 评论 -
匿名管道 的 管道复制(dup)
int dup(int oldfd);返回值:-1失败其他新的文件描述符int dup2(int oldfd, int newfd);返回值:-1失败其他最小及尚未使用的文件描述符原创 2017-05-11 22:18:10 · 322 阅读 · 0 评论 -
Linux中在终端捕获程序的返回值(return 0和exit(0))
在程序运行结束后,在终端(shell界面)上输入命令:echo $?显示的即为上一个程序结束时的返回值(return 1,exit(2),_exit(12)都可以,abort退出时,返回值为随机数)。功能:可以判断上一个程序时在什么情况下结束的:正常情况下,返回值为0即为正常退出;为1或-1为错误终止退出。也可以自己设置值。代码:#include int main原创 2017-05-12 23:04:38 · 10668 阅读 · 0 评论 -
结束进程方法
return:只能用在main函数内。exit():一般用在main函数以外的函数。_exit():一般用来结束子进程。abort():一般用来异常退出。信号终止:终止其他进程。函数套用:return-->exit-->_exitreturn函数中有调用exit的函数;exit的函数中有调用_exit的函数。即一般用return就有exit的功能了。原创 2017-05-10 17:39:03 · 299 阅读 · 0 评论 -
POSIX共享内存(内存映射)
本质:两个进程访问同一个逻辑内存;直接访问内存,不用read()/write(),非常方便。匿名映射文件:设备 作用 举例/dev/zero 永远输出0的设备文件 dd if=/dev/zero of=磁盘分区 count=1024 bs=1024/dev/null 丢弃一切写入其中数据 cat test > /d原创 2017-05-24 10:18:31 · 562 阅读 · 0 评论 -
system V 共享内存
头文件:sys/shm.h查看:ipcs共享内存获取:int shmget(key_t key,size_t size,int shmflg);key:IPC_PRIVATE——亲缘间ftok———————非亲缘间size:内存容量:非0——新建的共享内存大小0———获取共享内存shmflg:IPC_CREATIPC_CREAT|IPC_原创 2017-05-24 11:22:28 · 752 阅读 · 0 评论 -
信号量
分类:二值信号量——0和1计数信号量——0和n作用:控制多进程共享资源的访问P操作:0——挂起进程>0——减一V操作:0——恢复进程>0——加一本质:任意时刻只能有一个进程访问临界区(代码)原创 2017-05-24 13:21:35 · 196 阅读 · 0 评论 -
posix信号量
头文件:semaphore.h库:-pthread查看:ls /dev/shm/(所有名字前面都自动加上了sem.)man sem_overview命名信号量(基于文件):创建:sem_t* sem_open(const char* name,int oflag,mode_t mode,unsigned int value);name:信号量IPC名字。原创 2017-05-24 13:23:14 · 287 阅读 · 0 评论 -
socket编程——TCP
函数流程框图:创建:int socket(int domain,int type,int protocol);domain——>协议域:AF_INET————IPV4。AF_INET6————IPV6。AF_LOCAL————Unix域。type——>类型:SOCK_STREAM——流式套接字,TCP协议支持该套接字(提供面向连接,可靠的数据传输服务原创 2017-06-15 15:00:14 · 397 阅读 · 0 评论