共享内存Ftruncate

时间:2014-03-08 03:58:01

标签: c shared-memory

我正在尝试在父进程和子进程之间共享一些数据。我第一次可以将数据写入共享内存。但是,如果我想再写一个数据,我会遇到截断错误。我知道我的代码有问题。我觉得我需要实现基地址部分,但我不知道该怎么做。

void *attach_shmem(int shmem_fd, int object_size){
    void *addr;

/* resize it to something reasonable */
    if (ftruncate(shmem_fd, object_size) == -1){
        perror("failed to resize shared memory object\n");
        exit(EXIT_FAILURE);
    }

    addr = mmap(base, object_size, PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0);
    if (addr == MAP_FAILED){
        perror("failed to map shared memory object\n");
        exit(EXIT_FAILURE);
    }

    return addr;

}

void *map_shmem(char *path, int object_size){
    int shmem_fd;

/* open one that has already been created */
    shmem_fd = shm_open(path, O_RDWR, S_IRUSR | S_IWUSR);
    if (shmem_fd == -1){
        fprintf(stdout, "failed to open shared memory object\n");
        exit(EXIT_FAILURE);
    }

    return attach_shmem(shmem_fd, object_size);

}

void add_ip_to_shared_memory(char *ip, int val, int num)
{
    sem_t *sem = sem_open("/basag_sem", 0);
    struct SharedMem *node;
    char ip_binary[100];
    void *addr;

    strcpy(ip_binary, transform_ip_to_bits(ip));
    node = malloc(sizeof(struct SharedMem));
    strcpy(node->ip, strndup(ip_binary, num));
    node->val = val;
    //semaphore block
    sem_wait(sem);
    //add node to shared memory
    addr = map_shmem("gungor_shmem", sizeof(*node));
    memcpy(addr, node, sizeof(*node));
    base = addr;
    sem_post(sem);
    free(node);
    //semaphore release

//write_to_screen(node->ip);
    setbuf(stdout, NULL);
}

0 个答案:

没有答案