自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Qt Remote Object实现进程间通信

1 概述Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。QtRO本质上是一个点对点的通信网络。每个进程通过QRemoteObjectNode接入QtRO网络。功能提供节点(可以理解为服务器)需要使用QRemoteObjectHost将一个提供实际功能的QObject派生类注册进QtRO网络中,然后其他使用该功能的程序则通过各自的QRemoteObjectNode连接到该Host上,然后acquire一个该功能对象的Replica。等到该Re

2021-10-19 20:35:26 934

原创 回收进程

孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。僵尸进程:子进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。wait函数pid_t wait(int *status); 作用:① 阻塞等待子进程退出② 回收子进程残留资源③ 获取子进程结束状态(退出原因)可使用wait函数

2021-03-22 19:53:38 168

原创 循环创建多个子进程

#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ pid_t pid; int i=0; for(i=0;i<5;i++) { pid = fork(); if(pid == -1) { perror("fork error:"); exit(1); } else if(pid == 0) { break; //子进

2021-03-22 17:29:16 208

原创 exec函数族

当程序需要执行另一个程序时,就可以调用exec函数族的函数。有六种以exec开头的函数,统称exec函数:int execl(const char *path, const char *arg, …);通常用来加载用户程序int execlp(const char *file, const char *arg, …); 该函数通常用来调用系统程序。如:ls、cp、cat等命令。int execle(const char *path, const char *arg, …, char *const e

2021-03-22 17:28:51 143

原创 进程共享

父子进程之间在fork后。有哪些相同,那些相异之处呢?父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式…父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集父子进程间遵循读时共享写时复制的原则#include <stdio.h>#include <unistd.h>int a = 100; //.d

2021-03-22 17:28:16 84

原创 创建进程

大夫撒旦

2021-03-22 17:27:47 58

原创 多进程并发服务器

server.c#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <signal.h>#include <sys/wait.h>#include <sys/types.h>#include "wrap.h"#define MAXLINE 80#define SERV_POR

2021-03-16 21:16:24 65

原创 多线程并发服务器

server.c#include <stdio.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include <pthread.h>#include "wrap.h"#define MAXLINE 80#define SERV_PORT 6666struct s_info { struct sockaddr_in cliaddr; in

2021-03-16 21:15:40 90

原创 C/S模型 TCP (有出错处理)

为使错误处理的代码不影响主程序的可读性,我们把与socket相关的一些系统函数加上错误处理代码包装成新的函数,做成一个模块wrap.c,封装函数时应和系统函数的参数、返回值保持一致。函数名第一个字母大写,这样方便进man文档。wrap.h#ifndef __WRAP_H_#define __WRAP_H_void perr_exit(const char *s);int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr);int B

2021-03-16 21:08:29 83

原创 C/S模型 TCP (无出错处理)

server.c#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <strings.h>#include <string.h>#include <ctype.h>#include <arpa/inet.h>#define SERV_PORT 6666int m

2021-03-16 21:07:57 63

原创 网络套接字函数

文章目录socket模型创建流程图socket函数bind函数listen函数accept函数connect函数sockaddr数据结构socket模型创建流程图socket函数#include <sys/types.h>#include <sys/socket.h>int socket(int domain, int type, int protocol);domain:AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地

2021-03-16 21:07:22 86

原创 空指针和野指针

#include <iostream>using namespace std;int main(){ //指针变量p指向内存地址编号为0的空间 int* p1 = NULL; //访问空指针报错 //内存编号0 ~255为系统占用内存,不允许用户访问 cout << *p1 << endl; //指针变量p指向内存地址编号为0x1100的空间 int* p2 = (int*)0x1100; //访问野指针报错 cout <<

2021-03-15 22:10:33 88

原创 引用的本质

引用的本质是指针常量#include <iostream>using namespace std;//发现是引用,转换为 int* const ref = &a;void func(int& ref) { ref = 100; // ref是引用,转换为*ref = 100}int main() { int a = 10; //自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改 int&

2021-03-15 22:09:36 89

原创 冒泡排序

#include <iostream>using namespace std;//升序void test01(int *arr,int len){ for (size_t i = 0; i < len; i++) { for (size_t j = 0; j < len-i-1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1];

2021-03-15 22:08:52 41

原创 数组名的用途

一维数组名#include <iostream>using namespace std;int main(){ //1、可以获取整个数组占用内存空间大小 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "整个数组所占内存空间为: " << sizeof(arr) << endl; cout << "每个元素所占内存空间为: " << sizeof(arr[0]) &lt

2021-03-15 22:08:19 515

原创 const修饰指针

#include <iostream>using namespace std;int main() { int a = 10; int b = 10; //const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int* p1 = &a; p1 = &b; //正确 //*p1 = 100; 报错 //const修饰的是常量,指针指向不可以改,指针指向的值可以更改 int* const p2 = &a; //p2 =

2021-03-15 21:18:03 53

空空如也

空空如也

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

TA关注的人

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