- 博客(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
1131
1
原创 回收进程
孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。僵尸进程:子进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。wait函数pid_t wait(int *status); 作用:① 阻塞等待子进程退出② 回收子进程残留资源③ 获取子进程结束状态(退出原因)可使用wait函数
2021-03-22 19:53:38
227
原创 循环创建多个子进程
#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
279
原创 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
175
原创 进程共享
父子进程之间在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
111
原创 多进程并发服务器
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
94
原创 多线程并发服务器
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
124
原创 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
118
原创 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
94
原创 网络套接字函数
文章目录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
112
原创 空指针和野指针
#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
115
原创 引用的本质
引用的本质是指针常量#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
116
原创 冒泡排序
#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
67
原创 数组名的用途
一维数组名#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]) <
2021-03-15 22:08:19
583
原创 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
83
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人