国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

docker與宿主機(jī)共享內(nèi)存通信

這篇具有很好參考價(jià)值的文章主要介紹了docker與宿主機(jī)共享內(nèi)存通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

docker與宿主機(jī)共享內(nèi)存通信

docker中的進(jìn)程要與宿主機(jī)使用共享內(nèi)存通信,需要在啟動(dòng)容器的時(shí)候指定“–ipc=host”選項(xiàng)。然后再編寫(xiě)相應(yīng)的共享內(nèi)存的程序,一個(gè)跑在宿主機(jī)上,另一個(gè)跑在docker上面。

宿主機(jī)程序準(zhǔn)備

  • shm_data.h
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
 
#define TEXT_SZ 2048
 
struct shared_use_st
{
    int written; // 作為一個(gè)標(biāo)志,非0:表示可讀,0:表示可寫(xiě)
    char text[TEXT_SZ]; // 記錄寫(xiě)入 和 讀取 的文本
};
 
#endif
  • shm_slave.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include "shmdata.h"
 
int main(int argc, char **argv)
{
    void *shm = NULL;
    struct shared_use_st *shared = NULL;
    char buffer[BUFSIZ + 1]; // 用于保存輸入的文本
    int shmid;
 
    // 創(chuàng)建共享內(nèi)存
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
    if (shmid == -1)
    {
        fprintf(stderr, "shmget failed\n");
        exit(EXIT_FAILURE);
    }
 
    // 將共享內(nèi)存連接到當(dāng)前的進(jìn)程地址空間
    shm = shmat(shmid, (void *)0, 0);
    if (shm == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
 
    printf("Memory attched at %X\n", (int)shm);
 
    // 設(shè)置共享內(nèi)存
    shared = (struct shared_use_st *)shm;
    while (1) // 向共享內(nèi)存中寫(xiě)數(shù)據(jù)
    {
        // 數(shù)據(jù)還沒(méi)有被讀取,則等待數(shù)據(jù)被讀取,不能向共享內(nèi)存中寫(xiě)入文本
        while (shared->written == 1)
        {
            sleep(1);
            printf("Waiting...\n");
        }
 
        // 向共享內(nèi)存中寫(xiě)入數(shù)據(jù)
        printf("Enter some text: ");
        fgets(buffer, BUFSIZ, stdin);
        strncpy(shared->text, buffer, TEXT_SZ);
 
        // 寫(xiě)完數(shù)據(jù),設(shè)置written使共享內(nèi)存段可讀
        shared->written = 1;
 
        // 輸入了end,退出循環(huán)(程序)
        if (strncmp(buffer, "end", 3) == 0)
        {
            break;
        }
    }
 
    // 把共享內(nèi)存從當(dāng)前進(jìn)程中分離
    if (shmdt(shm) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }
 
    sleep(2);
    exit(EXIT_SUCCESS);
}
  • makefile
all:
	gcc -o shm_slave shm_slave.c
clean:
	rm -rf shm_slave

docker鏡像準(zhǔn)備

  • shm_data.h
#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
 
#define TEXT_SZ 2048
 
struct shared_use_st
{
    int written; // 作為一個(gè)標(biāo)志,非0:表示可讀,0:表示可寫(xiě)
    char text[TEXT_SZ]; // 記錄寫(xiě)入 和 讀取 的文本
};
 
#endif
  • shm_master.c
#include <stddef.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "shmdata.h"
 
int main(int argc, char **argv)
{
    void *shm = NULL;
    struct shared_use_st *shared; // 指向shm
    int shmid; // 共享內(nèi)存標(biāo)識(shí)符
    // 將內(nèi)容寫(xiě)入到文件,可以通過(guò)查看文件確定共享內(nèi)存是否成功
    FILE* file = fopen("t.txt","w+");
 
    // 創(chuàng)建共享內(nèi)存
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
    if (shmid == -1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
 
    // 將共享內(nèi)存連接到當(dāng)前進(jìn)程的地址空間
    shm = shmat(shmid, 0, 0);
    if (shm == (void *)-1)
    {
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
 
    printf("\nMemory attached at %X\n", (int)shm);
 
    // 設(shè)置共享內(nèi)存
    shared = (struct shared_use_st*)shm; // 注意:shm有點(diǎn)類(lèi)似通過(guò) malloc() 獲取到的內(nèi)存,所以這里需要做個(gè) 類(lèi)型強(qiáng)制轉(zhuǎn)換
    shared->written = 0;
    while (1) // 讀取共享內(nèi)存中的數(shù)據(jù)
    {
        // 沒(méi)有進(jìn)程向內(nèi)存寫(xiě)數(shù)據(jù),有數(shù)據(jù)可讀取
        if (shared->written == 1)
        {
            printf("You wrote: %s", shared->text);
            fputs(shared->text,file);
            fflush(file);
            sleep(1);
 
            // 讀取完數(shù)據(jù),設(shè)置written使共享內(nèi)存段可寫(xiě)
            shared->written = 0;
 
            // 輸入了 end,退出循環(huán)(程序)
            if (strncmp(shared->text, "end", 3) == 0)
            {
                break;
            }
        }
        else // 有其他進(jìn)程在寫(xiě)數(shù)據(jù),不能讀取數(shù)據(jù)
        {
            sleep(1);
        }
    }
 
    // 把共享內(nèi)存從當(dāng)前進(jìn)程中分離
    if (shmdt(shm) == -1)
    {
        fprintf(stderr, "shmdt failed\n");
        flcose(file);
        exit(EXIT_FAILURE);
    }
 
    // 刪除共享內(nèi)存
    if (shmctl(shmid, IPC_RMID, 0) == -1)
    {
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
        fclose(file);
        exit(EXIT_FAILURE);
    }
 	flcose(file);
    exit(EXIT_SUCCESS);
}
  • makefile
all:
	gcc -o shm_master shm_master.c
clean:
	rm -rf shm_master
  • Dockerfile
FROM gcc:latest

RUN  mkdir /usr/src/shm_test

COPY shm_master.c shm_data.h makefile /usr/src/shm_test/

WORKDIR /usr/src/shm_test

RUN  make

CMD ["./shm_master"]

運(yùn)行

運(yùn)行時(shí)需要先下載docker,獲取支持c語(yǔ)言編譯運(yùn)行的基礎(chǔ)鏡像,比如ubuntu、gcc等。這里使用gcc作為基礎(chǔ)鏡像。

sudo apt install docker
sudo docker pull gcc
# 查看一下gcc的鏡像是否拉取下來(lái)了
docker images

基礎(chǔ)鏡像有了后就可以基于基礎(chǔ)鏡像構(gòu)建docker容器,基于上面所寫(xiě)的dockerfile,構(gòu)建鏡像:

sudo docker build -t shm_master:v1 .
# 查看鏡像是否創(chuàng)建成功
sudo docker images

鏡像創(chuàng)建成功后就可以啟動(dòng)容器,啟動(dòng)時(shí)記得加上參數(shù)“–ipc”。

# fe9c3bd6d102是之前創(chuàng)建成功的鏡像的id
sudo docker run -d --ipc=host --name master fe9c3bd6d102

成功啟動(dòng)容器后可以進(jìn)入到容器內(nèi)部查看通信相關(guān)信息。

sudo docker exec -it master /bin/bash

reference

需要特別說(shuō)明的是:以下共享內(nèi)存的代碼均來(lái)自博客,在此表示感謝。docker鏡像創(chuàng)建參考自北極之光的博客。

  1. https://www.cnblogs.com/hailun1987/p/9697236.html

  2. https://www.jianshu.com/p/7eb7c7f62bf3

  3. https://www.cnblogs.com/52php/p/5861372.html文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729598.html

到了這里,關(guān)于docker與宿主機(jī)共享內(nèi)存通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Docker】docker容器內(nèi)獲取宿主機(jī)的信息和執(zhí)行宿主機(jī)的腳本

    【Docker】docker容器內(nèi)獲取宿主機(jī)的信息和執(zhí)行宿主機(jī)的腳本

    我們可以通過(guò)在容器內(nèi)遠(yuǎn)程連接宿主機(jī),然后對(duì)宿主機(jī)進(jìn)行操作。 注意: 要先安裝 sshpass命令才行。 Dockerfile文件可以在你部署容器的時(shí)候自動(dòng)安裝。 docker部署springboot項(xiàng)目

    2024年02月11日
    瀏覽(30)
  • Docker容器內(nèi)執(zhí)行宿主機(jī)指令

    Docker容器內(nèi)執(zhí)行宿主機(jī)指令

    ????????最近項(xiàng)目有個(gè)需求,需要程序配置服務(wù)器IP并且可以重啟服務(wù)器。如果程序直接部署在服務(wù)器,相信大家都會(huì)操作。但是程序是用docker運(yùn)行的,在docker中執(zhí)行指令就很麻煩了。這時(shí)候需要添加容器一些特殊的權(quán)限和執(zhí)行一些特殊的命令就可以執(zhí)行宿主機(jī)上面的指令

    2024年02月09日
    瀏覽(23)
  • Jenkins容器使用宿主機(jī)Docker

    構(gòu)建鏡像和發(fā)布鏡像到harbor都需要使用到docker命令。而在Jenkins容器內(nèi)部安裝Docker官方推薦直接采用宿主機(jī)帶的Docker即可。 設(shè)置Jenkins容器使用宿主機(jī)Docker 設(shè)置宿主機(jī)docker.sock權(quán)限: 添加數(shù)據(jù)卷

    2024年01月18日
    瀏覽(25)
  • docker 容器與宿主機(jī)時(shí)間同步

    1.docker run 2.Docker file 3.docker-compose 4.宿主機(jī)直接執(zhí)行命令給某個(gè)容器同步時(shí)間 注意:這種方式需要重啟容器 docker exec -it 70ec41893d66 /bin/bash 回車(chē)后輸入date驗(yàn)證即可

    2024年02月08日
    瀏覽(26)
  • docker 容器無(wú)法通過(guò) IP 訪問(wèn)宿主機(jī)

    一次部署項(xiàng)目過(guò)程中,將Java項(xiàng)目與中間件服務(wù)部署在同一遠(yuǎn)程機(jī)器上,出現(xiàn)連接不上中間件服務(wù)的問(wèn)題,而項(xiàng)目在本地運(yùn)行時(shí)是可以連接的,沒(méi)有問(wèn)題。 這是因?yàn)轫?xiàng)目與服務(wù)都是通過(guò)docker容器運(yùn)行的,而docker 容器無(wú)法通過(guò) IP 訪問(wèn)宿主機(jī)(貌似高版本解決了這個(gè)問(wèn)題),所以

    2024年02月09日
    瀏覽(27)
  • Docker第一講 Docker容器間/容器與宿主機(jī)ping不通解決

    Docker第一講 Docker容器間/容器與宿主機(jī)ping不通解決

    通過(guò)容器ip訪問(wèn) 容器重啟后,ip會(huì)發(fā)生變化。通過(guò)容器ip訪問(wèn)不是一個(gè)好的方案。 通過(guò)宿主機(jī)的ip:port訪問(wèn) 通過(guò)宿主機(jī)的ip:port訪問(wèn),只能依靠監(jiān)聽(tīng)在暴露出的端口的進(jìn)程來(lái)進(jìn)行有限的通信。 通過(guò)link建立連接(官方不推薦使用) 運(yùn)行容器時(shí),指定參數(shù)link,使得源容器與被鏈接

    2024年02月11日
    瀏覽(30)
  • 【docker知識(shí)】從容器中如何訪問(wèn)到宿主機(jī)

    【docker知識(shí)】從容器中如何訪問(wèn)到宿主機(jī)

    ????????使用 Docker 能實(shí)現(xiàn)服務(wù)的容器化,并使用容器間網(wǎng)絡(luò)在它們之間進(jìn)行通信。有時(shí)您可能需要一個(gè)容器來(lái)與宿主機(jī)上非容器化的服務(wù)通信。以下是如何從 Docker 容器中訪問(wèn)本地主機(jī)或 127.0.0.1的具體方法。 ????????適用于 Windows 和 Mac 的 Docker Desktop 18.03+ 支持 host.

    2024年02月02日
    瀏覽(26)
  • 【Docker小知識(shí)】(1)宿主機(jī)和容器的文件拷貝

    ????????docker cp 命令用于在本地文件系統(tǒng)與? Dokcer容器 ?之間復(fù)制文件或者文件夾。該命令后面的 CONTAINER 可以是容器Id,或者是容器名。 ????????宿主機(jī)是容器的托管環(huán)境,容器運(yùn)行在宿主機(jī)上。容器的創(chuàng)建、啟動(dòng)、停止、銷(xiāo)毀等操作都是在宿主機(jī)上進(jìn)行的。 ????

    2024年02月11日
    瀏覽(26)
  • 宿主機(jī)無(wú)法ping通docker容器IP解決

    宿主機(jī)無(wú)法ping通docker容器IP解決

    安裝docker后,發(fā)現(xiàn)啟動(dòng)容器的端口8082 映射到宿主機(jī)的端口80訪問(wèn)主機(jī)沒(méi)有反應(yīng),此時(shí)進(jìn)入容器查看日志,發(fā)現(xiàn)并沒(méi)有請(qǐng)求打進(jìn)來(lái) 現(xiàn)象: 正在連接 localhost (localhost)|::1|:80… 已連接。 已發(fā)出 HTTP 請(qǐng)求,正在等待回應(yīng)… 讀取文件頭錯(cuò)誤 (Connection reset by peer)。 重試中。 1:懷疑容

    2024年02月06日
    瀏覽(17)
  • 最簡(jiǎn)單配置jenkins容器使用宿主機(jī)的docker方法

    最簡(jiǎn)單配置jenkins容器使用宿主機(jī)的docker方法

    構(gòu)建鏡像和發(fā)布鏡像到harbor都需要使用到docker命令。而在Jenkins容器內(nèi)部安裝Docker官方推薦直接采用宿主機(jī)帶的Docker即可 設(shè)置宿主機(jī)docker.sock權(quán)限 chown root:root /var/run/docker.sock chmod o+rw /var/run/docker.sock 添加數(shù)據(jù)卷 version: \\\"3.1\\\" services: ? jenkins: ? ? image: jenkins/jenkins ? ? container_na

    2024年02月11日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包