小编pha*_*bit的帖子

用fork()共享堆内存

我正在使用C实现一个数据库服务器,它将处理来自多个客户端的请求.为此,我使用fork()来处理各个客户端的连接.

服务器将数据存储在堆中,该数据包含一个指向动态分配记录的哈希表的根指针.记录是具有指向各种数据类型的指针的结构.我希望这些进程能够共享这些数据,以便当客户端对堆进行更改时,其他客户端将看到更改.

我已经知道fork()使用COW(Copy On Write),我的理解是,当子进程尝试修改内存中的数据时,它将复制父进程的堆(和堆栈)内存.

我发现我可以使用shm库来共享内存.

- 是否足以共享数据库的根指针或是否必须将所有已分配的内存分享?

- 如果孩子分配内存,父/其他孩子能够访问它吗?

- 如果一个孩子分配内存并且后来被杀死,分配的内存是否仍然留在堆上?

那么例如下面的代码是否是共享堆内存的有效方式(在shared_string中)?如果一个孩子使用类似的代码(即从//开始),其他孩子是否能够在孩子跑步和死亡之后读/写?

key_t key;
int shmid;

key = ftok("/tmp",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);

//start
char * string;
string = malloc(sizeof(char) * 10);

strcpy(string, "a string");

char * shared_string;

shared_string = shmat(shmid, string, 0);

strcpy(shared_string, string);
Run Code Online (Sandbox Code Playgroud)

c c++ heap fork shared-memory

8
推荐指数
1
解决办法
3685
查看次数

如何在 GCC (x86_64) 中使用内联汇编进行相对跳转/调用

我正在编写一个漏洞利用程序来从头开始生成一个 shell。(即用于缓冲区溢出)。我面临的问题之一是让 jmp 语句起作用。我的理解是jmp指令是相对于ip的。但是,当我尝试在内联汇编中运行以下内容时,我会跳转到绝对地址。

jmp 0x28 #in inline GCC will jump to address 0x28 not 0x28 relative to the ip

我解决这个问题的一种方法是使用 IP 作为指令的一部分,如下所示:

jmp *0x28(%rip) #will jump to address 0x28 relative to the ip

但是,当我这样做时,我在 jmp 上遇到了分段错误

整个汇编代码如下:

void main() {
    __asm__(
    "jmp  *0x28(%rip)                           \n"
    "popq %rax                              \n" 
    "movw $0x0, 0x0(%rax)       #add null termination           \n"
    "movq %rax,0x8(%rax)        #set up argv in memory          \n"
    "movq $0, 0x10(%rax)                            \n"
    "mov $0x0, %edx         #set up arg 3               \n"
    "mov %rax, %rsi                             \n"
    "add …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64

7
推荐指数
1
解决办法
6804
查看次数

标签 统计

c ×2

assembly ×1

c++ ×1

fork ×1

gcc ×1

heap ×1

shared-memory ×1

x86-64 ×1