内存并在共享内存中的指针中传递值

时间:2016-04-15 17:38:05

标签: c struct malloc wait shared-memory

我尝试使用共享内存和活动等待在父级和10个子进程之间传递一些值。

struct中的一些值是指向外部动态内存的指针 当我试图在字符串中写一个数字来传递带有数字的路径文件时,会出现错误,但由于内存不存在,我不能这样做,我只能在没有数字的情况下进行。< / p>

typedef struct {
    char *path[10];
    char *word[10];
    int number_ocurrency[10];
    int flag[10];
} shared_data_type;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {
    int fd;
    int data_size = sizeof(shared_data_type),i;
    pid_t pid;
    shared_data_type *shared_data;

    if((fd = shm_open("/ex06_searchWord", O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR))==-1)
    {
        perror("Error at shared memory allocation!\n");
        return 0;
    }
    ftruncate (fd, data_size);
    shared_data = (shared_data_type *)mmap(NULL,data_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    for(i=0; i<10;i++){
        shared_data->flag[i]=0;
        pid=fork();
        if (pid == -1)
        {
            printf("Error at fork!\n");
            return -1;
        }

        if (pid == 0) { /* reader */
            while(!shared_data->flag[i]);
            FILE *file;
            file = fopen(shared_data->path[i], "r");
            if (file == NULL)
            {
                printf("Could not open/find the specified file.\n");
                return -1;
            }
            int size = 0;
            char readChar=NULL;
            char *msg = NULL;
            while((readChar = fgetc(file)) != EOF) {
                msg = (char *) realloc(msg, size+1);
                *(msg + size) = readChar;
                size++;
            }
            *(msg + size) = '\0';

            int count = 0;
            while(msg = strstr(msg, shared_data->word[i]))
            {
                count++;
                msg++;
            }
            shared_data->number_ocurrency[i]=count;
            exit(0);
        }
        if(pid>0){
            shared_data->word[i]="SCOMP";
            char path[16]="files/file1.txt";
            shared_data->path[i]=malloc(sizeof(path)+1);
            sprintf(shared_data->path[i],"files/file%d.txt",i);
            //shared_data->path[i]= "files/file.txt";
            shared_data->number_ocurrency[i]=0;
            shared_data->flag[i]=1;
        }
    }
    for(i=0; i<10;i++){
        wait(NULL);
    }


    for(i=0; i<10;i++){
        printf("The word %s in the son %d appeared: %d times\n",shared_data->word[i],i,shared_data->number_ocurrency[i]);
    }
    if (munmap(shared_data, data_size) == -1)
    {
        perror("Error at unmap!\n");
        return 0;
    }

    if(shm_unlink("/ex06_searchWord")==-1){
        perror("Error at unlink!\n");
        return 0;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

当您在进程之间共享字节时,您需要确保这些字节包含对将要使用它的所有进程有意义且易于理解的内容。将指针放在共享内存中未共享的内存中是没有意义的。除非所有进程都能保证在同一地址映射共享内存,否则将共享内存中的绝对指针放在共享内存中是没有意义的。

如果需要,可以将共享内存划分为“插槽”,并通过将插槽号放在共享内存中来获得在共享内存中指针的效果。考虑到映射的基址,插槽号必须在每个进程中转换为绝对地址和从绝对地址转换。