■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 最新50

プログラマが2chを救う!?2

766 :513 :01/08/28 11:17 ID:6S1uJJBo
513を書き換えてみた(Content-Length対応/sem,shm使用)
もしmalloc()/realloc()で実装してみようという人がいたらやってみて......
----------------------------------------------------------------------
#include <semaphore.h>
#include <sys/mman.h>

#define SEM_NAME "/shm-lock"
#define _SHM_MAX 100

int zz_tmpfd = -1; /* グローバル変数...スマソ */
sem_t *zz_sem = SEM_FAILED;

   :

char shm_name[15];
if ((zz_sem=sem_open(SEM_NAME, O_CREAT, 0600, _SHM_MAX)) == SEM_FAILED) {/* err */}
sem_wait(zz_sem);
sprintf(shm_name, "/read.%.6u", (unsigned)getpid());
if ((zz_tmpfd=shm_open(shm_name, O_RDWR|O_CREAT, 0600)) == -1) {/* err */}
shm_unlink(shm_name);
if ((pStdout=gzdopen(dup(zz_tmpfd), "wb")) == NULL) {/* err */}

   : /* pPrintf()実行 */

size_t content_length;
void *mmptr;
gzclose(pStdout); pStdout = stdout;
content_length = lseek(zz_tmpfd, 0, SEEK_END);

if ((mmptr=mmap(NULL, content_length, PROT_READ, MAP_SHARED, zz_tmpfd, 0)) == NULL) {/* err */}
printf("Content-Length: %lu\n\n", (u_long)content_length);
write(1, mmptr, content_length);
munmap(mmptr, content_length);
----------------------------------------------------------------------
で終了処理は
if (pStdout != NULL && pStdout != stdout) gzclose(pStdout);
if (zz_tmpfd != -1) close(zz_tmpfd);
if (zz_sem != SEM_FAILED) {sem_post(zz_sem); sem_close(zz_sem);}

ひょっとするとLDFLAGSに"-lrt"か"-lpthread"がいるかも

272KB
新着レスの表示

スレッドリストへ戻る 全部 前100 次100 最新50

0ch BBS 2004-10-30