Bagaimana untuk berkongsi memori antara proses Linux
Mekanisme komunikasi antara proses memori dikongsi digunakan terutamanya untuk memindahkan sejumlah besar data antara proses Rajah berikut menunjukkan gambarajah skema menggunakan memori dikongsi untuk memindahkan sejumlah besar data antara proses:
Memori dikongsi ialah ruang memori yang dibuka secara berasingan dalam memori Ruang memori ini mempunyai struktur datanya yang tersendiri, termasuk kebenaran akses, saiz dan masa akses terkini. Struktur data ditakrifkan seperti berikut:
from /usr/include/linux/shm.h struct shmid_ds { struct ipc_perm shm_perm; /* operation perms 操作权限 */ int shm_segsz; /* size of segment (bytes) 段长度大小 */ __kernel_time_t shm_atime; /* last attach time 最近attach时间 */ __kernel_time_t shm_dtime; /* last detach time 最近detach时间 */ __kernel_time_t shm_ctime; /* last change time 最近change时间 */ __kernel_ipc_pid_t shm_cpid; /* pid of creator 创建者pid */ __kernel_ipc_pid_t shm_lpid; /* pid of last operator 最近操作pid */ unsigned short shm_nattch; /* no. of current attaches */ unsigned short shm_unused; /* compatibility */ void *shm_unused2; /* ditto - used by DIPC */ void *shm_unused3; /* unused */ };
Sebelum dua proses menggunakan ruang memori kongsi ini, mereka perlu mewujudkan sambungan antara ruang alamat proses dan ruang memori kongsi, iaitu, lekapkan ruang memori kongsi ke dalam proses.
Sistem ini mengenakan sekatan berikut pada memori yang dikongsi:
#define SHMMAX 0x2000000 /* max shared seg size (bytes) 最大共享段大小 */ #define SHMMIN 1 /* min shared seg size (bytes) 最小共享段大小 */ #define SHMMNI 4096 /* max num of segs system wide */ #define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16)) #define SHMSEG SHMMNI /* max shared segs per process */
#include <sys> #include <sys></sys></sys>
/*
* Parameter pertama ialah nilai kunci, biasanya dijana oleh fungsi ftok()
* Parameter kedua ialah saiz segmen memori kongsi yang akan dibuat (dalam bait)
* Parameter ketiga digunakan untuk mengenal pasti pengecam penciptaan segmen memori kongsi
*/
int shmget(key_t key, size_t size, int shmflg);
#include <sys> #include <sys></sys></sys>
/*
* Parameter pertama ialah pengecam memori kongsi yang akan dikendalikan
* Parameter kedua ialah operasi yang akan dilakukan
* Parameter ketiga ialah maklumat pembolehubah memori dikongsi sementara bagi struktur shmid_ds
*/
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
Fungsi panggilan sistem shmat() memetakan segmen memori yang dikongsi ke segmen data proses panggilan dan mengembalikan alamat pertama ruang memori Fungsinya diisytiharkan seperti berikut:
#include <sys> #include <sys> </sys></sys>
/*
* Parameter pertama ialah pengecam memori kongsi yang akan dikendalikan
* Parameter kedua digunakan untuk menentukan alamat yang dipetakan bagi memori yang dikongsikan Jika ia bukan 0, parameter ini akan diperuntukkan oleh sistem
* Parameter ketiga digunakan untuk menentukan kebenaran akses dan keadaan pemetaan segmen memori kongsi
*/
void *shmat(int shmid, const void *shmaddr, int shmflg);
Selepas menggunakan ruang memori yang dikongsi, anda perlu menggunakan panggilan fungsi shmdt() untuk memisahkannya daripada proses semasa. Pengisytiharan fungsi adalah seperti berikut:
#include <sys> #include <sys> </sys></sys>
/*
* Parameter ialah alamat pertama memori kongsi yang diperuntukkan
*/
int shmdt(const void *shmaddr);
1. Selepas menggunakan fungsi fork() untuk mencipta proses anak, proses itu mewarisi memori kongsi yang dipasang oleh proses induk.
2 Jika exec() dipanggil untuk melaksanakan program baharu, semua memori kongsi yang dipasang akan dinyahlekap secara automatik.
3 Jika fungsi exit() dipanggil dalam proses, semua memori kongsi yang dipasang akan diputuskan sambungan daripada proses semasa.
Mohon untuk memori yang dikongsi, proses induk menyimpan integer pada alamat pertama, dan proses anak membacanya.
#include #include <sys> #include <sys> #include <sys> #include #include #define SHM_SIZE 1024 int main() { int shm_id, pid; int *ptr = NULL; </sys></sys></sys>
/* Mohon untuk ingatan bersama */
shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);
/* Petakan memori yang dikongsi untuk memproses ruang alamat */
ptr = (int*)shmat(shm_id, 0, 0); printf("Attach addr is %p \n", ptr); *ptr = 1004; printf("The Value of Parent is : %d \n", *ptr); if((pid=fork()) == -1){ perror("fork Err"); exit(0); } else if(!pid){ printf("The Value of Child is : %d \n", *ptr); exit(0); }else{ sleep(1);
/* Nyahpeta */
shmdt(ptr);
/* Padam memori kongsi */
shmctl(shm_id, IPC_RMID, 0); } return 0; }
Hasil keluaran:
Atas ialah kandungan terperinci Bagaimana untuk berkongsi memori antara proses Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Lima komponen asas sistem Linux adalah: 1. Kernel, 2. Perpustakaan Sistem, 3. Utiliti Sistem, 4. Antara Muka Pengguna Grafik, 5. Aplikasi. Kernel menguruskan sumber perkakasan, Perpustakaan Sistem menyediakan fungsi yang telah dikompilasi, utiliti sistem digunakan untuk pengurusan sistem, GUI menyediakan interaksi visual, dan aplikasi menggunakan komponen ini untuk melaksanakan fungsi.

Untuk melihat alamat repositori Git, lakukan langkah -langkah berikut: 1. Buka baris arahan dan navigasi ke direktori repositori; 2. Jalankan perintah "Git Remote -V"; 3. Lihat nama repositori dalam output dan alamat yang sepadan.

Walaupun Notepad tidak dapat menjalankan kod Java secara langsung, ia dapat dicapai dengan menggunakan alat lain: menggunakan pengkompil baris arahan (Javac) untuk menghasilkan fail bytecode (fileName.class). Gunakan Java Interpreter (Java) untuk mentafsir bytecode, laksanakan kod, dan output hasilnya.

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

Terdapat enam cara untuk menjalankan kod di Sublime: melalui hotkeys, menu, sistem membina, baris arahan, menetapkan sistem binaan lalai, dan arahan membina adat, dan menjalankan fail/projek individu dengan mengklik kanan pada projek/fail. Ketersediaan sistem membina bergantung kepada pemasangan teks luhur.

Untuk memasang Laravel, ikuti langkah -langkah berikut dalam urutan: Pasang komposer (untuk macOS/linux dan windows) Pasang pemasang Laravel Buat aplikasi akses perkhidmatan permulaan projek baru (URL: http://127.0.0.1:8000) Sediakan sambungan pangkalan data (jika diperlukan)

Memasang Perisian Git Termasuk langkah -langkah berikut: Muat turun pakej pemasangan dan jalankan pakej pemasangan untuk mengesahkan pemasangan pemasangan git git git (Windows Only)

Terdapat banyak cara untuk menyesuaikan persekitaran pembangunan, tetapi fail konfigurasi GIT global adalah salah satu yang paling mungkin digunakan untuk tetapan tersuai seperti nama pengguna, e -mel, editor teks pilihan, dan cawangan terpencil. Berikut adalah perkara penting yang perlu anda ketahui mengenai fail konfigurasi GIT global.
