
进程通信
扳手的海角
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
332_C++_mmap 映射文件或设备到进程的地址空间,或者创建一个新的映射区域
提供了一种高效的方式来访问文件,特别是大文件,因为它们允许将文件的一部分或全部直接映射到进程的地址空间中,从而减少了传统读/写系统调用所涉及的内核和用户空间之间的数据拷贝.原创 2024-05-13 09:43:29 · 198 阅读 · 0 评论 -
330_C++_HTTP_登录login使用CURLOPT_HEADERFUNCTION获取头数据token和cookie,用于下次API调用curl中CURLOPT_HTTPHEADER的使用
CURLOPT_HEADERFUNCTION是libcurl库中的一个选项,用于设置自定义的header处理函数。libcurl是一个功能强大的库,用于在网络上进行各种类型的传输,包括HTTP、FTP等1。当libcurl发送HTTP请求时,它会将请求头发送到服务器。CURLOPT_HEADERFUNCTION选项允许你自定义处理这些header数据的方式,例如解析、修改或记录它们1。原创 2024-05-10 15:49:50 · 196 阅读 · 0 评论 -
324_C++_HTTP_curl-post连接,设置TCP连接为长连接
HTTP的POST方法是一种用于向指定的资源提交数据,以请求服务器进行处理的方式。它是HTTP协议中的一种请求方法,与GET方法相比,POST方法主要用于发送数据到服务器,而不是从服务器检索数据原创 2024-04-30 16:32:38 · 224 阅读 · 0 评论 -
91_文件io_磁盘映射读、写【难点:为什么先创建文件?以及创建文件为空,会出现总线错误 (核心已转储)】
动图:先写操作:#include <stdio.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>#include <string.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/shm.h>#include <unistd.h>#原创 2021-09-08 17:45:33 · 211 阅读 · 0 评论 -
115_多线程_任务:生产者、消费者,仓库一次只能进入一人,最多存放10个产品;仓库空,消费者不能再拿产品,仓库满生产者不能在生产【采用信号、互斥锁完成,注意信号不为0就会一直执行,解锁不加延时】
动图:预解:生产者抢到信号,num初始值3生产者的信号数量是 7 ,代表他可以循环 7 次, 直到sem_wait -- 到0,才会阻塞但是呢, 在一个人运行的时候, 另一个人必须停在那里,等到这个人运行结束所以 需要互斥锁!!在【生产者】运行时, sem1--, sem++7 次后, sem1==0, 停止, 开始轮到阻塞在外面的 【消费者】sem通过于是【生产者】解锁 !!这里【生产者】不会再次抢到锁,因为他的信号已经是 0 了,会阻塞在外面此时仓库有 10 个 产品, 所以原创 2021-09-13 20:57:59 · 226 阅读 · 0 评论 -
114_多线程_(同113)通过磁盘映射,为多个进程(父子进程),发送多个信号sem、sem1... ,实现【同步!】
d动图:#if 1sem_t *sem = NULL;// -->定义一个信号量地址sem_t *sem1 = NULL;// sem_t *sem2 = NULL;//void my_print(char *str){ //printf("%s\n", str); while (*str != '\0') { putchar(*str); fflush(stdout); str++;原创 2021-09-13 19:26:35 · 156 阅读 · 0 评论 -
114_多线程_- 通过磁盘映射,为多个进程(父子进程),发送信号sem ,实现互斥 --【注意:创建磁盘映射、信号量的顺序,二者都需要进行地址操作!】
动图:在这里插入代码片 char *str = (char *) mmap(NULL, 32, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); -1 :匿名映射不用打开文件,标志:MAP_ANONYMOUS 磁盘映射的时候以及为其分配了32位大小的空间了(磁盘映射地址的长度) sem_init():不可以放在mmap()前面,因为 为文件设置了 0 的偏移量 进程运行时,从文件里拿到的 sem 信号就成原创 2021-09-13 19:22:42 · 146 阅读 · 0 评论 -
113_多线程_定义3个不同的信号sem, sem1, sem2, 顺序执行,【可以同步,非人为】
动图:提前了解:【callback】中sem先拿到1信号,执行到hello,【sem--】 --> 0, 然后【sem1++】对阻塞在外面的sem1进行激活【callback_1】中然后【sem1】-->变成1, 执行到world, 【sem1--】-->0,然后【sem2++】对阻塞在外面的sem2进行激活 ---> 变成1【callback_2】中【sem2】-->变成1, 执行到dear, 【sem2--】-->变成0 ,【sem++ 】对阻塞在外面的se原创 2021-09-13 19:06:47 · 282 阅读 · 0 评论 -
112_多线程_三个相同信号Sem【优先级是一样的,没有专门指定谁先,由CPU分配】,三个线程互斥,执行一遍退出
动图:–无序的代码:#if 1 // ----------- 相同信号Sem【优先级是一样的,没有专门指定谁先,由CPU分配】,三个线程互斥 ------------// // ------ 不带for循环不在人为给定运行后得顺序,是互斥,因为是谁先抢到谁先执行 ----------//sem_t sem;void my_print(char *str){ //printf("%s\n", str); while (*str != '\0') {原创 2021-09-13 19:01:12 · 122 阅读 · 0 评论 -
111_多线程_信号量得互斥【sem_getvalue获取信号保存在一个常量得地址中、sem_trywait,尝试获取保存在sem_num中得信号】【for得理解,同步110编号】
#if 1 //------------2--trywait----- 不带for循环,是互斥,因为是谁先抢到谁先执行 for也只是人为得同步 ------------------------//sem_t sem;void my_print(char *str){ //printf("%s\n", str); while (*str != '\0') { putchar(*str); fflush(stdout);原创 2021-09-13 18:54:55 · 299 阅读 · 0 评论 -
110_多线程_信号量(sem)实现线程间互斥 + 人为的同步(通过for循环和sleep延时)【sem_wait、sem_post】
动图:提前了解:额外注意:for 以及 for中的sleep(1)sem_wait以及sem_post中的sem是同步的,一个执行,另一个阻塞在那里等待sem_post对sem的++操作,将另一个阻塞的线程唤醒这里的for 以及 for中的sleep(1), 都是人为的让两个线程去同步,有规律执行如果没有sleep(1), 假设【callback】抢到了资源, 它在结束玩执行, 进行唤醒操作的时候,自身阻塞在那里的sem信号,就可能还会先于【callback_1】抢到资源所以这里的sl原创 2021-09-13 17:50:07 · 773 阅读 · 0 评论 -
109_多线程_另一种同步条件变量+互斥锁【这里可以完成同步,但是注意:线程的执行顺序是同时进行的,所以对其中个别操作添加延时,以让部分步骤充分响应】【条件变量的broadcast、wait】
动图–一个在打印里去掉了延时:解析–提前看一下两个线程的锁、解锁等操作,是同时进行的进入线程, 1、 2开始抢资源 1、 1 抢到, 进入资源,那 2 就会阻塞住然后打印"hello", 接着 1 线程开始解锁, /2 线程同步的会进入资源,上锁开始执行操作 2 线程会迅速的进入资源,并且上锁 ,为了防止 2 线程会立刻打印"world"我们为 2 线程 添加一个【条件变量】的阻塞,让它停在(阻塞)在执行【my_print】的外面 2、2 线程进入资源后, 会遇到 【条件变量】原创 2021-09-11 18:24:01 · 141 阅读 · 0 评论 -
108_多线程_多任务读不互斥,写互斥(互斥锁,无法实现多任务同步)一个线程抢到写权限,另一个线程就不能写)【在解锁的后面加延时,可以让另外的线程,抢到执行机会】
动图:.... 读、写都在解锁的最后加有延时.注意–读、写有区别:#include<stdio.h>#include<stdlib.h>#include<string.h>#include <pthread.h>#include <semaphore.h>int num=10;pthread_rwlock_t rwlock;void* callback_2(void * arg){ while(1){ pthrea原创 2021-09-11 15:52:37 · 161 阅读 · 0 评论 -
107_多线程_【有名信号量sem_①】【互斥、同步】实现不相干进程(不同的.c文件)同步【注意:带for是同步,没有for是互斥!!】
动图:sem_opne 1#if 1 //--------1---创建 有名信号 -------------- //void my_print(char *str){ //printf("%s\n", str); while (*str != '\0') { putchar(*str); fflush(stdout); str++; sleep(1); } pr原创 2021-09-11 14:45:47 · 145 阅读 · 0 评论 -
106_多线程_【pthread_cancel、pthread_setcancelstate、pthread_setcanceltype、取消点、线程终止、cleanup_push、pop注册清理】
线程取消(pthread_cancel)基本概念pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint)。取消点是线程检查是否被取消并按照请求进行动作的一个位置....与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值。发送成功并不意味着threa原创 2021-09-10 20:07:58 · 339 阅读 · 0 评论 -
105_多线程_互斥锁_第1篇【pthread_mutex_lock()创建两个线程,同一时间只能有一个运行,一个一个的打印其中的字符串】【lock 、unlock理解】
东方图:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include <pthread.h>#include <string.h>pthread_mutex_t mutex;//= PTHREAD_MUTEX_INITIALIZER;void my_print(char *str){ //printf("%s\n", str); while (*s原创 2021-09-10 17:34:13 · 253 阅读 · 2 评论 -
104_多线程_很普通的用【pthread_create】创建1000个线程【数组形式】,要【pthread_join】阻塞住(pth[ i ])
#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include <pthread.h>void *callback(void * agc){ #if 0 //响应【pthread_cancel】,PTHREAD_CANCEL_DEFERRED:不立即被取消 pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);原创 2021-09-10 15:50:12 · 224 阅读 · 0 评论 -
103_多线程_线程池的创建--以及创建完成,创建线程池任务,添加延时的注意【pool_init、pool_add_task、pool_uninit删除线程池】
注意:#include <stdio.h>#include <unistd.h>#include "thread_pool.h"void *task_test(void *arg){ //printf("\t\tworking on task %d\n", (int)arg); //sleep(1); /*休息一秒,延长任务的执行时间*/ int i = 0; for(;i != 3;) { i=i+1; printf("线程函数执行 第 %d原创 2021-09-10 15:40:23 · 165 阅读 · 0 评论 -
102_多线程_【普通多线程创建】以及【给运行函数传参】【pthread_create、pthread_self(gettid和pthread_self区别)两个函数】
动图:–创建线程的过程中会有微妙的延迟#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include <pthread.h>void callback(void * agc){ while(1) { int num = (int)agc;//这里接收的是值传递,不需要强转 sleep(1); printf(" 0号线程原创 2021-09-09 21:10:05 · 159 阅读 · 0 评论 -
101_同【97】【signal、sigismember、abort()】
动图:代码中注意的图片:#include <sys/types.h>#include <signal.h>#include <unistd.h>#include <stdlib.h>#include <sys/wait.h>#include <stdio.h>int main(){ sigset_t set; sigemptyset(&set); //sigfillset(&a原创 2021-09-09 20:28:37 · 120 阅读 · 0 评论 -
97_进程通信_通过信号、信号集函数,进程函数完成延时杀死士兵、秦王、宫女等人的操作【父进程中的kill()操作在while中、sigset_t set、sigprocmask、sigaddset】
动图:signal(2,SIG_IGN);//父进程忽略杀死信号--因父进程需要它去回收子进kill(0,2);sigaddset(&set, 2);//添加信号到集合中sigemptyset(&set);sigprocmask(SIG_BLOCK, &set, NULL);sigprocmask(SIG_UNBLOCK, &set, NULL);进程回收,就证明被杀死了!!!#include <sys/types.h>#include &l原创 2021-09-09 17:39:57 · 129 阅读 · 0 评论 -
96_进程通信_对signal信号的理解【创建父子进程中对kill()信号的修改阻止某一进程被杀死、对setitimer()定时器的触发时间以及周期的信号事件触发】
一个信号只会处理一个进程–多个子进程中如果想要不被kill杀死,同样需要一个信号setitimer:设置第一次定时时间和周期–其中的信号、触发时间以及周期原创 2021-09-09 12:48:56 · 241 阅读 · 0 评论