写两份c程序,一份用于共享内存链表,另一份读取这个链表
时间: 2023-06-12 19:07:59 浏览: 92
这里提供两份C程序,一份用于创建并操作共享内存中的链表,另一份用于读取共享内存中的链表。
共享内存链表:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
int main() {
int shmid = shmget(IPC_PRIVATE, sizeof(Node), IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget failed");
exit(1);
}
Node* head = (Node*) shmat(shmid, NULL, 0);
head->data = 0;
head->next = NULL;
Node* curr = head;
for (int i = 1; i <= 10; i++) {
Node* new_node = (Node*) malloc(sizeof(Node));
new_node->data = i;
new_node->next = NULL;
curr->next = new_node;
curr = new_node;
}
while (1) {
printf("Shared memory ID: %d\n", shmid);
printf("Linked list contents:\n");
Node* curr = head->next;
while (curr) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n\n");
sleep(5);
}
shmdt(head);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
```
读取共享内存链表:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
int main() {
int shmid = shmget(IPC_PRIVATE, sizeof(Node), IPC_CREAT | 0666);
if (shmid < 0) {
perror("shmget failed");
exit(1);
}
Node* head = (Node*) shmat(shmid, NULL, 0);
while (1) {
printf("Shared memory ID: %d\n", shmid);
printf("Linked list contents:\n");
Node* curr = head->next;
while (curr) {
printf("%d ", curr->data);
curr = curr->next;
}
printf("\n\n");
sleep(5);
}
shmdt(head);
return 0;
}
```
这两份程序都使用了共享内存,通过 `shmget()` 函数创建共享内存段。两份程序都定义了一个链表结构体 `Node`,其中 `main()` 函数中的第一行代码使用 `shmget()` 函数创建共享内存段,并将其 ID 存储在 `shmid` 变量中。然后,第二行使用 `shmat()` 函数将共享内存段附加到进程的地址空间中,返回指向链表头结点的指针 `head`。在第二份程序中,也进行了相同的操作。
第一份程序使用循环创建一个链表,并不断打印链表的内容。第二份程序则不创建链表,而是不断打印共享内存段中的链表内容。两份程序都使用 `sleep()` 函数暂停 5 秒钟,以使程序不断运行。
最后,两份程序都使用 `shmdt()` 函数将共享内存段从进程的地址空间中分离,并使用 `shmctl()` 函数删除共享内存段。
阅读全文