gpt4 book ai didi

c - 通过C中的共享内存将结构传递给进程

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:35 26 4
gpt4 key购买 nike

对于 uni 作业,我试图在共享内存中创建一个结构,在其中写入一些数据,然后让 child 读取它。我想出了一些办法,但是,由于我是 C 的新手,我遇到了一些我不太理解的错误,这是代码:

typedef struct file
{
int pid;
char tipo[2];
char nome[20];
unsigned long genoma;
char shmPtr[];
} file_entry;

int main (void)
{

int shmid;
int n;
file_entry *entries;

if (fork() == 0) {
if ((shmid = shmget(20441, sizeof(file_entry) + 256, IPC_CREAT | 0666)) == -1) {
printf("shmget");
exit(2);
}

entries = (file_entry*) shmat(shmid, 0, 0);
if (entries->shmPtr == (char *) -1) {
printf("problem2");
exit(2);
}

printf("\nChild Reading ....\n\n");
printf("%c\n", entries->shmPtr[0]);
printf("%c\n", entries->shmPtr[1]);
printf("%c\n", entries->shmPtr[2]);
printf("%c\n", entries->shmPtr[3]);
putchar('\n');
printf("\nDone\n\n");
} else {
if ((shmid = shmget(20441, sizeof(file_entry) + 256, IPC_CREAT | 0666)) == -1) {
printf("problem3");
exit(2);
}

entries = (file_entry *) shmat(shmid, 0, 0);
if (entries->shmPtr == (char *) -1) {
printf("problem4");
exit(2);
}
printf("done attachment");

int pidD = 1234;
char tipoD[2] = "A";
char nomeD[20] = "NOMEINDIVIDUO";
unsigned long genomaD = 10000;


entries->shmPtr[0]= pidD;
entries->shmPtr[1]=tipoD;
entries->shmPtr[2]=nomeD;
entries->shmPtr[3]= genomaD;


wait(NULL);
shmdt(&shmid);
}
exit(0);

我得到的错误是:

shared memory example 2.c:74:27: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Wint-conversion]
entries->shmPtr[1]=tipoD;
^~~~~~
shared memory example 2.c:75:27: warning: incompatible pointer to integer conversion assigning to 'char' from 'char [20]' [-Wint-conversion]
entries->shmPtr[2]=nomeD;

我试图将结构中变量的维数和父变量的维数声明为相同,以为这会有帮助,但事实并非如此。有谁知道如何解决这个问题?如果您还有一些示例代码,我们将不胜感激。

最佳答案

我试过这个测试应用程序并且它有效:

#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct file
{
int pid;
char tipo[2];
char nome[20];
unsigned long genoma;
} file_entry;

int main (void)
{

int shmid;
int n;
file_entry *entries;

if (fork() == 0) {
if ((shmid = shmget(20441, sizeof(file_entry) + 256, IPC_CREAT | 0666)) == -1) {
printf("shmget");
exit(2);
}

entries = (file_entry*) shmat(shmid, 0, 0);
if (entries == NULL) {
printf("problem2");
exit(2);
}

printf("\nChild Reading ....\n\n");
printf("%d\n", entries->pid);
printf("%s\n", entries->tipo);
printf("%s\n", entries->nome);
printf("%lu\n", entries->genoma);
putchar('\n');
printf("\nDone\n\n");
} else {
if ((shmid = shmget(20441, sizeof(file_entry) + 256, IPC_CREAT | 0666)) == -1) {
printf("problem3");
exit(2);
}

entries = (file_entry *) shmat(shmid, 0, 0);
if (entries == NULL ) {
printf("problem4");
exit(2);
}
printf("done attachment");

int pidD = 4001;
char tipoD[2] = "A";
char nomeD[20] = "sfds";
unsigned long genomaD = 10000;


entries->pid = pidD;
sprintf(entries->tipo,"%s",tipoD);
sprintf(entries->nome,"%s",nomeD);
entries->genoma= genomaD;


wait(NULL);
shmdt(&shmid);
}
exit(0);
}

关于c - 通过C中的共享内存将结构传递给进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47728710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com