fork子进程与子线程在共享内存中的区别

前言


       这两周做了很多关于共享内存,fork子进程与线程的工作,收获很大。先记录个小问题,关于主线程中fork子进程与子线程在共享内存中更新数据的问题。这些知识在书中是都能够了解到的,但如果没有亲身遭遇或者实践过,绝对不会有深切的感受。


子进程与子线程在共享内存中的区别


       简单来说,有两个进程A与B,A与B通过共享内存方式实现进程间数据交换。 同时,进程A通过消息队列实时监听的进程B数据更新通知,然后进行对共享内存中的数据操作。最后,主进程通过Socket方式对进程A的数据进行访问。


       实现方式一:

       进程A通过fork产生的子进程实现对进程B的实时监听。整体过程如下图:

         

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在两个非fork进程实现共享内存读写的同步,可以使用信号量(semaphore)来实现。信号量是一种进程间通信机制,用于实现进程的同步与互斥。 下面是一个使用semop实现共享内存读写同步的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #define SHM_SIZE 1024 union semun { int val; struct semid_ds *buf; unsigned short *array; }; int main() { int shmid, semid; char *shmaddr; union semun sem_union; struct sembuf sem_op; // 创建共享内存 shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666); if (shmid == -1) { perror("shmget error"); exit(EXIT_FAILURE); } // 连接共享内存 shmaddr = shmat(shmid, NULL, 0); if (shmaddr == (char *) -1) { perror("shmat error"); exit(EXIT_FAILURE); } // 创建信号量 semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666); if (semid == -1) { perror("semget error"); exit(EXIT_FAILURE); } // 初始化信号量 sem_union.val = 0; if (semctl(semid, 0, SETVAL, sem_union) == -1) { perror("semctl error"); exit(EXIT_FAILURE); } // 写入共享内存 sem_op.sem_num = 0; sem_op.sem_flg = 0; sem_op.sem_op = -1; // P操作 if (semop(semid, &sem_op, 1) == -1) { perror("semop error"); exit(EXIT_FAILURE); } printf("Enter a message: "); fgets(shmaddr, SHM_SIZE, stdin); sem_op.sem_num = 0; sem_op.sem_flg = 0; sem_op.sem_op = 1; // V操作 if (semop(semid, &sem_op, 1) == -1) { perror("semop error"); exit(EXIT_FAILURE); } // 读取共享内存 sem_op.sem_num = 0; sem_op.sem_flg = 0; sem_op.sem_op = -1; // P操作 if (semop(semid, &sem_op, 1) == -1) { perror("semop error"); exit(EXIT_FAILURE); } printf("Received message: %s", shmaddr); sem_op.sem_num = 0; sem_op.sem_flg = 0; sem_op.sem_op = 1; // V操作 if (semop(semid, &sem_op, 1) == -1) { perror("semop error"); exit(EXIT_FAILURE); } // 删除信号量和共享内存 if (semctl(semid, 0, IPC_RMID, sem_union) == -1) { perror("semctl error"); exit(EXIT_FAILURE); } if (shmdt(shmaddr) == -1) { perror("shmdt error"); exit(EXIT_FAILURE); } if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl error"); exit(EXIT_FAILURE); } return 0; } ``` 在上面的示例代码,我们先创建了一个共享内存一个信号量。然后,在写入共享内存前,我们使用了P操作来获取信号量,以确保共享内存可写。接下来,我们从标准输入读取一行内容,并将其写入共享内存。完成后,我们使用V操作释放信号量,以确保其他进程可以读取共享内存。 读取共享内存的方式类似,我们先使用P操作获取信号量,然后读取共享内存的内容,最后使用V操作释放信号量,以确保其他进程可以继续写入共享内存。最后,我们删除了信号量和共享内存。 需要注意的是,上面的示例代码只使用了一个信号量,因此只能保证单个进程的读写同步。如果有多个进程需要读写共享内存,需要使用多个信号量来实现不同进程之间的同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值