1.c


// 、、使用内存映射可以拷贝文件
/*
对原始文件进行内存映射
创建一个新文件
把新文件的数据拷贝映射到内存中
通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区
释放资源
*/// 匿名映射,不需要文件实体来进行内存映射
// 只能用于有血缘关系的进程间通信
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
// int main()
// {/*
// kill函数
// pid》0将信号发送给指定进程
// =0:将信号发送给当前进程组
// =-1:将信号发送给每一个有权限接受这个信号的进程
// 《-1:进程组id的绝对值
// sig,要发送的信号
// kill(getppid(), 9);
// kill(getpid(), 9);
// raise函数,给当前进程发送信号
// sig,要发送的信号,成功返回0,失败返回非0*/
// alarm函数
// 设置定时器,倒计时,当时间为0的时候,会给当前进程发送一个 SIGALARM信号
// 取消定时器,alarm(0)即可
// 返回值是unsigned int,倒计时剩余的时间(上一个alarm剩余的时间)
// SIGALRARM信号默认终止当前进程,每个进程只能设置一个定时器
// int seconds = alarm(5);
// printf("%d\n", seconds);
//  sleep(2);
//  seconds = alarm(3);
// printf("%d\n", seconds);
// while(1){// }
// 1秒钟电脑能输多少个数?
//无论进程处于什么状态,alarm都会正常计时
// 实际时间=内核时间+用户时间+io消耗的时间
// alarm(1);
// int i =0;
// while(1){//     printf("%d\n",i++);
// }// settimeer函数,用于替换alarm函数,且精度比alarm要高很多,
// 参数
// which,定时器以什么时间计时
//     ITIME_REAL: 真实时间,时间到达,就发送SIGALRM
//     ITIME_VIRTUAL;用户时间,时间到达就发送SIGVTALRM
//     ITIMER_PROF:进程在内核状态下消耗的时间
// 过3秒后,每两秒执行一次
// struct itimerval new_value;
// // 设置值
// new_value.it_interval.tv_sec = 2;
// new_value.it_interval.tv_usec =0;
// new_value.it_value.tv_sec=3;
// new_value.it_value.tv_usec=0;
// int ret = setitimer(ITIMER_REAL,&new_value,NULL);
// printf("定时器开始\n");
// if (ret==-1){//     perror("settimer");
//     exit(0);
// }
// getchar();
// signal捕获信号
// sigkill,sigstop既不能被捕捉也不能被忽略
// signum:要捕捉的信号
// handler:捕捉到信号之后如何处理
//     sig_ign:忽略
//     sig_dfl:使用信号默认的行为
//     回调函数:捕获到信号后执行该函数
// 过3秒后,每两秒执行一次
// 注册信号捕捉函数
//忽略信号
// signal(SIGALRM,SIG_IGN);
//直行信号的默认动作(sig_ALRM结束程序)
// signal(SIGALRM,SIG_DFL);
// void (*sig_handler)(int),这是一个函数指针。返回void,参数int,函数名称:sig_handler
void sig_handler(int num) {printf("捕获到了信号:%d\n", num);printf("lllllllllllllll]n");
}//     信号集
//     产生但是还没有被处理的信号被归到未决信号集//     sigint信号状态被存储在第二个bit位上
//         bit位为1,说明信号处于未决状态
// 未决状态对的信号需要备处理
// 但是在处理之前需要和另一个叫做阻塞信号集的对应比特位进行比较
// 如果对应位置是1,那么就说明信号被阻塞,那么这个信号就不会被处理,直到指变成0
// 阻塞信号集默认不阻塞任何信号,我们可以手动进行设置(调用系统API)// sigemptyset函数
//     清空信号集中的数据,所有标志位被设置为0
//     参数:set,要设置的信号集
// sigfillset函数
//     设为1
// sigaddset函数
//     设置信号集中的某一个标志位设置为1
// sigdelset 函数
//     和上面的相反,0
// sigismember函数
//     判断某个信号是否阻塞
// 上面的函数都是阻塞信号集的操作函数
// 创建一个信号集
// sigset_t set ;
// // 先清空
// sigemptyset(&set);
// // 判断信号是否在信号集中
// int ret = sigismember(&set,SIGINT);
// if (ret == 0) {// printf("SIGINT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGINT 阻塞\n");// }
// // 添加信号到信号集中
// sigaddset(&set,SIGINT);
// sigaddset(&set,SIGQUIT);
//  ret = sigismember(&set,SIGINT);
// if (ret == 0) {// printf("SIGINT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGINT 阻塞\n");// }
//  ret = sigismember(&set,SIGQUIT);
// if (ret == 0) {// printf("SIGQUIT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGQUIT 阻塞\n");// }
// sigdelset(&set, SIGQUIT);
//  ret = sigismember(&set,SIGQUIT);
// if (ret == 0) {// printf("SIGQUIT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGQUIT 阻塞\n");// }
// 系统调用设置信号集
// sigprocmask
// 该函数可以将我们自定义的信号集映射到内核中
// how:
//     如何对内核中的阻塞信号集进行处理
//         sig_block,mask|set
//         SIG_UNBLOCK: mask^set(异或操作
//         sig_setmask 覆盖内核的指
// sigpending
//     获取内核当中的未决信号集// 编写一个程序,将所有的常规信号(1-31)的未决状态打印出来
// 设置某些信号是阻塞的,通过键盘来产生这些信号ctrl+?
// 设置2、3信号阻塞
// sigset_t set;
// sigemptyset(&set);
// // 将2、3信号添加到信号集中
// sigaddset(&set,SIGINT);
// sigaddset(&set,SIGQUIT);
// //修改内核中的阻塞信号集
// sigprocmask(SIG_BLOCK,&set, NULL);
// int num=0;
// while(1) {//     printf("num:%d\n",num);
//     if(num == 10){//         // 解除sigint的阻塞
//         sigprocmask(SIG_UNBLOCK,&set,NULL);
//     }
//     num++;
//     // 获取当前的未决信号集
//     sigset_t pendingset;
//     sigemptyset(&pendingset);
//     sigpending(&pendingset);
//     //遍历bit位
//     for(int i=1;i<=32;i++) {// if(sigismember(&pendingset,i)==1){//     printf("1");
// }else if(sigismember(&pendingset, i)==0) {//     printf("0");
// }else{//     perror("sigismember\n");exit(0);
// }//     }printf("\n");sleep(1);
// }
// sigaction
// 检查或者改变信号的处理方式
// signum,需要捕捉的信号
// act,捕捉到信号后需要执行的动作
// oldaact,没用// struct sigaction
//     sa_handle:回调函数指针//     临时阻塞信号集
//     sa_mask
//     临时阻塞某些信号// 使用那个信号处理对信号进行处理。如果是0表示使用回调函数
//     // 必须在设置定时器之前注册回调函数
// 最好使用sigaction去注册回调函数
// struct sigaction act;
// act.sa_flags = 0;
// act.sa_sigaction = sig_handler;
// //清空临时阻塞信号集
// sigemptyset(&act.sa_mask);
// sigaction(SIGALRM,&act,NULL);
// // sig_t retr =  signal(SIGALRM,sig_handler);
// // if(retr==SIG_ERR) {// //     perror("signal注册");
// //     exit(-1);
// // }
// struct itimerval new_value;
// // 设置值
// new_value.it_interval.tv_sec = 2;
// new_value.it_interval.tv_usec =0;
// new_value.it_value.tv_sec=3;
// new_value.it_value.tv_usec=0;
// int ret = setitimer(ITIMER_REAL,&new_value,NULL);
// printf("定时器开始\n");
// if (ret==-1){//     perror("settimer");
//     exit(0);
// }
// // getchar();
// // while(1);
// sigchild信号产生的条件
//     子进程终止
//     子进程接收到sigstop信号停止
//     子进程处于停滞状态,收到sigcont后唤醒
// 父进程默认葫芦该信号
// 可以用于解决僵尸进城的问题
void sig_handler2(int num){printf("捕捉奥得信号:%d\n",num);// 回首紫禁城// while(1){// wait(NULL);}while (1){int ret =waitpid(-1,NULL,WNOHANG);/* code */if(ret>0){printf("二字挂了:%d\n", ret);}else if(ret ==0) {// 说明还有子进程或者break;}else if(ret ==- 1){// 没有紫禁城了break;}}}
#include<sys/shm.h>
int main()
{//     // 提前设置好阻塞信号集
//     // 阻塞sigchild
//     // 因为UN在西main这种可能:
//     //     子进程在注册号回调函数之前就已经结束了
// sigset_t set;
// sigemptyset(&set);
// sigaddset(&set,SIGCHLD);
// sigprocmask(SIG_BLOCK,&set  ,NULL);// pid_t pid;
// int count=20;
// for (size_t i = 0; i < count; i++)
// {//     pid = fork();
//     if(pid==0){//         break;
//     }
//     /* code */// }
// // 捕捉子进程死亡时发送的sigchild信号
// struct sigaction act;
// act.sa_flags=0;
// act.sa_sigaction = sig_handler2;
// sigemptyset(&act.sa_mask);
// sigaction(SIGCHLD,&act,NULL);
// // 注册完信号捕捉之后,就接触阻塞
// sigprocmask(SIG_UNBLOCK,&set,NULL);
// if(pid>0){//     // 父进程
//     while(1){//         printf("我是你爹\n");
//         sleep(2);
//     }} else if(pid==0){//         printf("儿字:%d\n",getpid());
//     }// pid_t pid = fork();
// if(pid==0){//     for(int i=0;i<5;i++) {//         printf("孩子进程%d\n", i);
//         sleep(1);
//     }
// }else if(pid>0) {//   printf("爹进程\n");
//   sleep(2);
//   printf("傻儿子\n");
//   kill(pid,SIGINT);
// }
// 共享内存
// 创建一个新的内存共享段
// 或者获取一个   既有的共享内存段
// shmat和当前进程进行关联
// shmdat,移除和当前进程的关联
// shmctl
// 创建一个共享内存
int shmid = shmget(100,4096,IPC_CREAT|0664);
// 和当前进程进行关联
void* ptr = shmat(shmid,NULL,0);
printf("%d\n", shmid);
char*str = "hello world";
memcpy(ptr,str,strlen(str)+1);
printf("按任意键继续\n");
getchar();
shmdt(ptr);
shmctl(shmid,IPC_RMID,NULL);return 0;}
/*// char * buf;// strcpy(buf, "cao nima");return 0;}/*// 修改mmap的flags参数,之前使用的是MAP_SHARED// 现在我们要用的是MAP_ANONint len = 1204;void *ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);if (ptr == MAP_FAILED){perror("mmap");exit(0);}// 父子进程间通信int pid = fork();if (pid > 0){strcpy((char *)ptr, "hello world");wait(NULL);}else if (0 == pid){sleep(1);printf("%s\n", (char *)ptr);}// 释放内存映射区int ret = munmap(ptr, len);// int fd = open("englsih.txt", O_RDONLY);// // 获取原始文件的大小// int len = lseek(fd, 0, SEEK_END);// // 创建一个新文件,并对其大小进行拓展// int fd1 = open("cpy.txt", O_CREAT | O_RDWR, 0664);// truncate("cpy.txt", len);// write(fd1, " ", 1);// // 分别进行内存映射// void *ptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);// void *ptr1 = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);// if (ptr == MAP_FAILED)// {//     perror("mmap");//     exit(0);// }// if (ptr1 == MAP_FAILED)// {//     perror("mmap");//     exit(0);// }// // 内存拷贝// memcpy(ptr1, ptr, len);// munmap(ptr1, len);// munmap(ptr, len);// close(fd1);// close(fd);return 0;
}
*/

2.c

// 、、使用内存映射可以拷贝文件
/*
对原始文件进行内存映射
创建一个新文件
把新文件的数据拷贝映射到内存中
通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区
释放资源
*/// 匿名映射,不需要文件实体来进行内存映射
// 只能用于有血缘关系的进程间通信
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
// int main()
// {/*
// kill函数
// pid》0将信号发送给指定进程
// =0:将信号发送给当前进程组
// =-1:将信号发送给每一个有权限接受这个信号的进程
// 《-1:进程组id的绝对值
// sig,要发送的信号
// kill(getppid(), 9);
// kill(getpid(), 9);
// raise函数,给当前进程发送信号
// sig,要发送的信号,成功返回0,失败返回非0*/
// alarm函数
// 设置定时器,倒计时,当时间为0的时候,会给当前进程发送一个 SIGALARM信号
// 取消定时器,alarm(0)即可
// 返回值是unsigned int,倒计时剩余的时间(上一个alarm剩余的时间)
// SIGALRARM信号默认终止当前进程,每个进程只能设置一个定时器
// int seconds = alarm(5);
// printf("%d\n", seconds);
//  sleep(2);
//  seconds = alarm(3);
// printf("%d\n", seconds);
// while(1){// }
// 1秒钟电脑能输多少个数?
//无论进程处于什么状态,alarm都会正常计时
// 实际时间=内核时间+用户时间+io消耗的时间
// alarm(1);
// int i =0;
// while(1){//     printf("%d\n",i++);
// }// settimeer函数,用于替换alarm函数,且精度比alarm要高很多,
// 参数
// which,定时器以什么时间计时
//     ITIME_REAL: 真实时间,时间到达,就发送SIGALRM
//     ITIME_VIRTUAL;用户时间,时间到达就发送SIGVTALRM
//     ITIMER_PROF:进程在内核状态下消耗的时间
// 过3秒后,每两秒执行一次
// struct itimerval new_value;
// // 设置值
// new_value.it_interval.tv_sec = 2;
// new_value.it_interval.tv_usec =0;
// new_value.it_value.tv_sec=3;
// new_value.it_value.tv_usec=0;
// int ret = setitimer(ITIMER_REAL,&new_value,NULL);
// printf("定时器开始\n");
// if (ret==-1){//     perror("settimer");
//     exit(0);
// }
// getchar();
// signal捕获信号
// sigkill,sigstop既不能被捕捉也不能被忽略
// signum:要捕捉的信号
// handler:捕捉到信号之后如何处理
//     sig_ign:忽略
//     sig_dfl:使用信号默认的行为
//     回调函数:捕获到信号后执行该函数
// 过3秒后,每两秒执行一次
// 注册信号捕捉函数
//忽略信号
// signal(SIGALRM,SIG_IGN);
//直行信号的默认动作(sig_ALRM结束程序)
// signal(SIGALRM,SIG_DFL);
// void (*sig_handler)(int),这是一个函数指针。返回void,参数int,函数名称:sig_handler
void sig_handler(int num) {printf("捕获到了信号:%d\n", num);printf("lllllllllllllll]n");
}//     信号集
//     产生但是还没有被处理的信号被归到未决信号集//     sigint信号状态被存储在第二个bit位上
//         bit位为1,说明信号处于未决状态
// 未决状态对的信号需要备处理
// 但是在处理之前需要和另一个叫做阻塞信号集的对应比特位进行比较
// 如果对应位置是1,那么就说明信号被阻塞,那么这个信号就不会被处理,直到指变成0
// 阻塞信号集默认不阻塞任何信号,我们可以手动进行设置(调用系统API)// sigemptyset函数
//     清空信号集中的数据,所有标志位被设置为0
//     参数:set,要设置的信号集
// sigfillset函数
//     设为1
// sigaddset函数
//     设置信号集中的某一个标志位设置为1
// sigdelset 函数
//     和上面的相反,0
// sigismember函数
//     判断某个信号是否阻塞
// 上面的函数都是阻塞信号集的操作函数
// 创建一个信号集
// sigset_t set ;
// // 先清空
// sigemptyset(&set);
// // 判断信号是否在信号集中
// int ret = sigismember(&set,SIGINT);
// if (ret == 0) {// printf("SIGINT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGINT 阻塞\n");// }
// // 添加信号到信号集中
// sigaddset(&set,SIGINT);
// sigaddset(&set,SIGQUIT);
//  ret = sigismember(&set,SIGINT);
// if (ret == 0) {// printf("SIGINT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGINT 阻塞\n");// }
//  ret = sigismember(&set,SIGQUIT);
// if (ret == 0) {// printf("SIGQUIT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGQUIT 阻塞\n");// }
// sigdelset(&set, SIGQUIT);
//  ret = sigismember(&set,SIGQUIT);
// if (ret == 0) {// printf("SIGQUIT 不阻塞\n");
// }else if(ret == 1) {// printf("SIGQUIT 阻塞\n");// }
// 系统调用设置信号集
// sigprocmask
// 该函数可以将我们自定义的信号集映射到内核中
// how:
//     如何对内核中的阻塞信号集进行处理
//         sig_block,mask|set
//         SIG_UNBLOCK: mask^set(异或操作
//         sig_setmask 覆盖内核的指
// sigpending
//     获取内核当中的未决信号集// 编写一个程序,将所有的常规信号(1-31)的未决状态打印出来
// 设置某些信号是阻塞的,通过键盘来产生这些信号ctrl+?
// 设置2、3信号阻塞
// sigset_t set;
// sigemptyset(&set);
// // 将2、3信号添加到信号集中
// sigaddset(&set,SIGINT);
// sigaddset(&set,SIGQUIT);
// //修改内核中的阻塞信号集
// sigprocmask(SIG_BLOCK,&set, NULL);
// int num=0;
// while(1) {//     printf("num:%d\n",num);
//     if(num == 10){//         // 解除sigint的阻塞
//         sigprocmask(SIG_UNBLOCK,&set,NULL);
//     }
//     num++;
//     // 获取当前的未决信号集
//     sigset_t pendingset;
//     sigemptyset(&pendingset);
//     sigpending(&pendingset);
//     //遍历bit位
//     for(int i=1;i<=32;i++) {// if(sigismember(&pendingset,i)==1){//     printf("1");
// }else if(sigismember(&pendingset, i)==0) {//     printf("0");
// }else{//     perror("sigismember\n");exit(0);
// }//     }printf("\n");sleep(1);
// }
// sigaction
// 检查或者改变信号的处理方式
// signum,需要捕捉的信号
// act,捕捉到信号后需要执行的动作
// oldaact,没用// struct sigaction
//     sa_handle:回调函数指针//     临时阻塞信号集
//     sa_mask
//     临时阻塞某些信号// 使用那个信号处理对信号进行处理。如果是0表示使用回调函数
//     // 必须在设置定时器之前注册回调函数
// 最好使用sigaction去注册回调函数
// struct sigaction act;
// act.sa_flags = 0;
// act.sa_sigaction = sig_handler;
// //清空临时阻塞信号集
// sigemptyset(&act.sa_mask);
// sigaction(SIGALRM,&act,NULL);
// // sig_t retr =  signal(SIGALRM,sig_handler);
// // if(retr==SIG_ERR) {// //     perror("signal注册");
// //     exit(-1);
// // }
// struct itimerval new_value;
// // 设置值
// new_value.it_interval.tv_sec = 2;
// new_value.it_interval.tv_usec =0;
// new_value.it_value.tv_sec=3;
// new_value.it_value.tv_usec=0;
// int ret = setitimer(ITIMER_REAL,&new_value,NULL);
// printf("定时器开始\n");
// if (ret==-1){//     perror("settimer");
//     exit(0);
// }
// // getchar();
// // while(1);
// sigchild信号产生的条件
//     子进程终止
//     子进程接收到sigstop信号停止
//     子进程处于停滞状态,收到sigcont后唤醒
// 父进程默认葫芦该信号
// 可以用于解决僵尸进城的问题
void sig_handler2(int num){printf("捕捉奥得信号:%d\n",num);// 回首紫禁城// while(1){// wait(NULL);}while (1){int ret =waitpid(-1,NULL,WNOHANG);/* code */if(ret>0){printf("二字挂了:%d\n", ret);}else if(ret ==0) {// 说明还有子进程或者break;}else if(ret ==- 1){// 没有紫禁城了break;}}}
#include<sys/shm.h>
int main()
{//     // 提前设置好阻塞信号集
//     // 阻塞sigchild
//     // 因为UN在西main这种可能:
//     //     子进程在注册号回调函数之前就已经结束了
// sigset_t set;
// sigemptyset(&set);
// sigaddset(&set,SIGCHLD);
// sigprocmask(SIG_BLOCK,&set  ,NULL);// pid_t pid;
// int count=20;
// for (size_t i = 0; i < count; i++)
// {//     pid = fork();
//     if(pid==0){//         break;
//     }
//     /* code */// }
// // 捕捉子进程死亡时发送的sigchild信号
// struct sigaction act;
// act.sa_flags=0;
// act.sa_sigaction = sig_handler2;
// sigemptyset(&act.sa_mask);
// sigaction(SIGCHLD,&act,NULL);
// // 注册完信号捕捉之后,就接触阻塞
// sigprocmask(SIG_UNBLOCK,&set,NULL);
// if(pid>0){//     // 父进程
//     while(1){//         printf("我是你爹\n");
//         sleep(2);
//     }} else if(pid==0){//         printf("儿字:%d\n",getpid());
//     }// pid_t pid = fork();
// if(pid==0){//     for(int i=0;i<5;i++) {//         printf("孩子进程%d\n", i);
//         sleep(1);
//     }
// }else if(pid>0) {//   printf("爹进程\n");
//   sleep(2);
//   printf("傻儿子\n");
//   kill(pid,SIGINT);
// }
// 共享内存
// 创建一个新的内存共享段
// 或者获取一个   既有的共享内存段
// shmat和当前进程进行关联
// shmdat,移除和当前进程的关联
// shmctl
// 获取一个共享内存
int shmid = shmget(100,0,IPC_CREAT);
printf("%d\n", shmid);
// 和当前进程进行关联
void* ptr = shmat(shmid,NULL,0);
// char*str = "hello world";
// 读数据
printf("%s\n",(char*)ptr);// memcpy(ptr,str,strlen(str)+1);
printf("按任意键继续\n");
getchar();
shmdt(ptr);
shmctl(shmid,IPC_RMID,NULL);return 0;}
/*// char * buf;// strcpy(buf, "cao nima");return 0;}/*// 修改mmap的flags参数,之前使用的是MAP_SHARED// 现在我们要用的是MAP_ANONint len = 1204;void *ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);if (ptr == MAP_FAILED){perror("mmap");exit(0);}// 父子进程间通信int pid = fork();if (pid > 0){strcpy((char *)ptr, "hello world");wait(NULL);}else if (0 == pid){sleep(1);printf("%s\n", (char *)ptr);}// 释放内存映射区int ret = munmap(ptr, len);// int fd = open("englsih.txt", O_RDONLY);// // 获取原始文件的大小// int len = lseek(fd, 0, SEEK_END);// // 创建一个新文件,并对其大小进行拓展// int fd1 = open("cpy.txt", O_CREAT | O_RDWR, 0664);// truncate("cpy.txt", len);// write(fd1, " ", 1);// // 分别进行内存映射// void *ptr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);// void *ptr1 = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0);// if (ptr == MAP_FAILED)// {//     perror("mmap");//     exit(0);// }// if (ptr1 == MAP_FAILED)// {//     perror("mmap");//     exit(0);// }// // 内存拷贝// memcpy(ptr1, ptr, len);// munmap(ptr1, len);// munmap(ptr, len);// close(fd1);// close(fd);return 0;
}
*/

C语言 共享内存实现进程间通信相关推荐

  1. QT实现共享内存进行进程间通信

    QT实现共享内存进行进程间通信 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 演示使用带有QSharedMemory类的共享内存进行进程间通信. 共享内存示例显示了 ...

  2. java 共享内存ipc_进程间通信——IPC之共享内存

    共享内存是三个IPC机制中的一个.它允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在进行的进程之间传递数据的一种非常有效的方式. 大多数的共享内存的实现,都把由不同进程之间共享的内存安排为 ...

  3. python多进程共享内存_python 进程间通信 共享内存

    python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...

  4. python进程共享内存_Python进程间通信之共享内存

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Pyt ...

  5. linux c之使用共享内存实现进程间通信

    这篇博客有别人的也有自己改的,作为读书笔记,勿喷. 1.共享内存的介绍 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进 ...

  6. linux 共享内存_linux进程间通信----IPC篇(一)----共享内存初识篇

    先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 一 what 所 ...

  7. 通过共享内存进行进程间通信

    共享内存的工作方式顾名思义,共享内存让一段内存可供多个进程访问.用特殊的系统调用(即对 UNIX 内核的请求)分配和释放内存并设置权限:通过一般的读写操作读写内存段中的数据.共享内存并不是从某一进程拥 ...

  8. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  9. linux java 共享内存_Linux进程间通信之共享内存

    一,共享内存 内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存. 映射物理内存叫挂接,用完以后解除映射叫脱接. 1,共享内存的特点: ...

最新文章

  1. 将一张图片分割成多张小图片 Python3
  2. [NPUCTF2020]Mersenne twister
  3. SendInput代替了keybd_event
  4. Centos Another app is currently holding the yum lock
  5. C语言试题四十三之求出ss所指字符串中指定字符的个数,并返回此值。
  6. 自从有了这个工具,一键代码迁移不在话下
  7. 关于按字寻址和按字节寻址的理解
  8. itest(爱测试) 3.3.7 发布,开源BUG 跟踪管理 敏捷测试管理软件
  9. python实现点击按钮_python实现点击按钮修改数据的方法
  10. 拓端tecdat|R语言用Garch模型和回归模型对股票价格分析
  11. android 开发 耳机接口 自拍,首次用KXD手机就为之倾倒,这就是KXD K30手机带来了魅力...
  12. 企业微信加好友太频繁怎么办?
  13. day46 html
  14. 导师吐槽大会:自己招的学生,哭着也要带完
  15. MySQL数据库期末考试试题及参考答案(01)
  16. 车联网-App车况展示数据设计思路
  17. Java-栈的基本操作
  18. docker使用alpine镜像
  19. linux 下执行shutdown.sh命令不能关闭tomcat进程的解决方法
  20. 教你一招:使用最快速的方式激活windows10专业版

热门文章

  1. [汇总]Flex面试题及答案
  2. 【优化求解】基于和声搜索算法对IEEE33节点进行无功优化matlab代码
  3. OpenType字库文件
  4. PAT甲级考纲(最少的时间换尽可能多的分数)
  5. 边缘计算与通信的深度融合
  6. 云计算openstack——云计算、大数据、人工智能(16)
  7. 《送元二使安西》 王维渭城朝雨浥轻尘,客舍清清柳色新。劝君更尽一杯酒,西出阳关无故人。英文
  8. 长沙“一江两岸”新网红,看铜官古镇的“文和游”
  9. 微信公众号简易入门教程
  10. 给Ubuntu文件夹解锁