⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shm.c

📁 apache的软件linux版本
💻 C
📖 第 1 页 / 共 2 页
字号:
                                 APR_READ | APR_WRITE | APR_CREATE | APR_EXCL,                                 pool);         if (status != APR_SUCCESS) {            return status;        }        status = apr_file_trunc(file, new_m->realsize);        if (status != APR_SUCCESS) {            shm_unlink(filename); /* we're failing, remove the object */            return status;        }        new_m->base = mmap(NULL, reqsize, PROT_READ | PROT_WRITE,                           MAP_SHARED, tmpfd, 0);        /* FIXME: check for errors */        /* FIXME: Is it ok to close this file when using shm_open?? */        status = apr_file_close(file);        if (status != APR_SUCCESS) {            return status;        }#endif /* APR_USE_SHMEM_MMAP_SHM */        /* store the real size in the metadata */        *(apr_size_t*)(new_m->base) = new_m->realsize;        /* metadata isn't usable */        new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t));        apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner,                                  apr_pool_cleanup_null);        *m = new_m;        return APR_SUCCESS;#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */#if APR_USE_SHMEM_SHMGET        new_m->realsize = reqsize;        /* FIXME: APR_OS_DEFAULT is too permissive, switch to 600 I think. */        status = apr_file_open(&file, filename,                                APR_WRITE | APR_CREATE | APR_EXCL,                               APR_OS_DEFAULT, pool);        if (status != APR_SUCCESS) {            return status;        }        /* ftok() (on solaris at least) requires that the file actually         * exist before calling ftok(). */        shmkey = ftok(filename, 1);        if (shmkey == (key_t)-1) {            return errno;        }        if ((new_m->shmid = shmget(shmkey, new_m->realsize,                                   SHM_R | SHM_W | IPC_CREAT | IPC_EXCL)) < 0) {            return errno;        }        if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) {            return errno;        }        new_m->usable = new_m->base;        if (shmctl(new_m->shmid, IPC_STAT, &shmbuf) == -1) {            return errno;        }        apr_uid_current(&uid, &gid, pool);        shmbuf.shm_perm.uid = uid;        shmbuf.shm_perm.gid = gid;        if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) {            return errno;        }        nbytes = sizeof(reqsize);        status = apr_file_write(file, (const void *)&reqsize,                                &nbytes);        if (status != APR_SUCCESS) {            return status;        }        status = apr_file_close(file);        if (status != APR_SUCCESS) {            return status;        }        apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner,                                  apr_pool_cleanup_null);        *m = new_m;         return APR_SUCCESS;#endif /* APR_USE_SHMEM_SHMGET */    }    return APR_ENOTIMPL;}APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m){    return apr_pool_cleanup_run(m->pool, m, shm_cleanup_owner);}static apr_status_t shm_cleanup_attach(void *m_){    apr_shm_t *m = (apr_shm_t *)m_;    if (m->filename == NULL) {        /* It doesn't make sense to detach from an anonymous memory segment. */        return APR_EINVAL;    }    else {#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM        if (munmap(m->base, m->realsize) == -1) {            return errno;        }        return APR_SUCCESS;#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */#if APR_USE_SHMEM_SHMGET        if (shmdt(m->base) == -1) {            return errno;        }        return APR_SUCCESS;#endif    }    return APR_ENOTIMPL;}APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,                                         const char *filename,                                         apr_pool_t *pool){    if (filename == NULL) {        /* It doesn't make sense to attach to a segment if you don't know         * the filename. */        return APR_EINVAL;    }    else {#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM        apr_shm_t *new_m;        apr_status_t status;        int tmpfd;        apr_file_t *file;   /* file where metadata is stored */        apr_size_t nbytes;        new_m = apr_palloc(pool, sizeof(apr_shm_t));        if (!new_m) {            return APR_ENOMEM;        }        new_m->pool = pool;        new_m->filename = apr_pstrdup(pool, filename);        status = apr_file_open(&file, filename,                                APR_READ | APR_WRITE,                               APR_OS_DEFAULT, pool);        if (status != APR_SUCCESS) {            return status;        }        status = apr_os_file_get(&tmpfd, file);        if (status != APR_SUCCESS) {            return status;        }        nbytes = sizeof(new_m->realsize);        status = apr_file_read(file, (void *)&(new_m->realsize),                               &nbytes);        if (status != APR_SUCCESS) {            return status;        }        status = apr_os_file_get(&tmpfd, file);        if (status != APR_SUCCESS) {            apr_file_close(file); /* ignore errors, we're failing */            apr_file_remove(new_m->filename, new_m->pool);            return status;        }        new_m->reqsize = new_m->realsize - sizeof(apr_size_t);        new_m->base = mmap(NULL, new_m->realsize, PROT_READ | PROT_WRITE,                           MAP_SHARED, tmpfd, 0);        /* FIXME: check for errors */                status = apr_file_close(file);        if (status != APR_SUCCESS) {            return status;        }        /* metadata isn't part of the usable segment */        new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t));        apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_attach,                                  apr_pool_cleanup_null);        *m = new_m;        return APR_SUCCESS;#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */#if APR_USE_SHMEM_SHMGET        apr_shm_t *new_m;        apr_status_t status;        apr_file_t *file;   /* file where metadata is stored */        apr_size_t nbytes;        key_t shmkey;        new_m = apr_palloc(pool, sizeof(apr_shm_t));        if (!new_m) {            return APR_ENOMEM;        }        /* FIXME: does APR_OS_DEFAULT matter for reading? */        status = apr_file_open(&file, filename,                                APR_READ, APR_OS_DEFAULT, pool);        if (status != APR_SUCCESS) {            return status;        }        nbytes = sizeof(new_m->reqsize);        status = apr_file_read(file, (void *)&(new_m->reqsize),                               &nbytes);        if (status != APR_SUCCESS) {            return status;        }        status = apr_file_close(file);        if (status != APR_SUCCESS) {            return status;        }        new_m->filename = apr_pstrdup(pool, filename);        new_m->pool = pool;        shmkey = ftok(filename, 1);        if (shmkey == (key_t)-1) {            return errno;        }        if ((new_m->shmid = shmget(shmkey, 0, SHM_R | SHM_W)) == -1) {            return errno;        }        if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) {            return errno;        }        new_m->usable = new_m->base;        new_m->realsize = new_m->reqsize;        apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_attach,                                  apr_pool_cleanup_null);        *m = new_m;        return APR_SUCCESS;#endif /* APR_USE_SHMEM_SHMGET */    }    return APR_ENOTIMPL;}APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m){    apr_status_t rv = shm_cleanup_attach(m);    apr_pool_cleanup_kill(m->pool, m, shm_cleanup_attach);    return rv;}APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m){    return m->usable;}APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m){    return m->reqsize;}APR_POOL_IMPLEMENT_ACCESSOR(shm)APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm,                                         apr_shm_t *shm){    return APR_ENOTIMPL;}APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m,                                         apr_os_shm_t *osshm,                                         apr_pool_t *pool){    return APR_ENOTIMPL;}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -