資源簡介
僅可用于科研學習目的,切勿用于商業或論文發表。
代碼片段和文件信息
/*
?*?Some?functions?callable?from?fortran?to?use?shared?memory
?*?wv?2011
?*?shmem?stuff?from?Willem?Vermin?SARA
?*/
#include?
#include?
#include?
#include?
#include?
#include?
/*
?*?get?a?shared?memory?segment
?*?input:?size?(fortran?integer*8)
?*?output:?shmem?id
?*/
void?getshmem_(size_t?*size?int*id)
{
??key_t?key;
??int?shmflg;
??int?shmid;
??key?=?IPC_PRIVATE;
??shmflg?=?IPC_CREAT?|?IPC_EXCL?|?0600?|?SHM_NORESERVE?;
??shmid?=?shmget(key?*size?shmflg);
??if?(shmid?==?-1)
??{
????fprintf(stderr“%s?in?%s:?cannot?create?shared?segment?%ld?\n“__FUNCTION____FILE__*size);
????perror(0);
????exit(1);
??}
??*id?=?shmid;
}
void?getshmem_error_(size_t?*size?int*id)
{
??key_t?key;
??int?shmflg;
??int?shmid;
??key?=?IPC_PRIVATE;
??shmflg?=?IPC_CREAT?|?IPC_EXCL?|?0600?|?SHM_NORESERVE?;
??shmid?=?shmget(key?*size?shmflg);
??*id?=?shmid;
}
/*
?*?attach?shared?memory?to?a?pointer
?*?input:?shhmid:?shared?memory?id
?*?output:?address?(fortran?integer*8)
?*/
void?attachshmem_(int?*shmid?void?**address)
{
??void?*shmaddr*r;
??int?shmflg;
??shmflg?=?0;
??shmaddr?=?0;
??r?=?shmat(*shmid?shmaddr?shmflg);
??if?(r?==?(void*)?-1)
??{
????fprintf(stderr“%s?in?%s:?cannot?get?address?of?shared?segment\n“__FUNCTION____FILE__);
????perror(0);
????exit(1);
??}
??*address?=?r;
}
/*
?*?detach?shared?memory?from?pointer
?*?input:?address?(fortran?integer*8)
?*/
void?detachshmem_(void?**address)
{
??int?r;
??r?=?shmdt(*address);
??if?(r?==?-1)
??{
????fprintf(stderr“%s?in?%s:%d:?cannot?detach?shared?segment\n“__FUNCTION____FILE____LINE__);
????perror(0);
????exit(1);
??}
}
/*
?*?destroy?shared?memory
?*?input:?shmid:?shared?memory?id
?*/
void?destroyshmem_(int?*shmid)
{
??struct?shmid_ds?buf;
??int?r?=?shmctl(*shmidIPC_RMID&buf);
??if?(r?==?-1)
??{
????fprintf(stderr“%s?in?%s:%d:?cannot?destroy?shared?segment\n“__FUNCTION____FILE____LINE__);
????perror(0);
????exit(1);
??}
}
/*
?*?get?a?set?of?semaphores
?*?input:?size?
?*?output:?semaphores?id
?*/
void?getsem_(int?*size?int*id)
{
??key_t?key;
??int?semflg;
??int?semid;
??int?mysize;
??int?i?rc;
??short??sarray[(*size)+1];
??key?=?IPC_PRIVATE;
??semflg?=?IPC_CREAT?|?IPC_EXCL?|?0600;
??semflg?=?IPC_CREAT?|?0600;
??mysize=(*size)+1?;
??/*?here?I?have?an?odd?problem:?using?*size+1?instead?of?mysize?
?????sometimes?failed
?????very?odd?some?cross?C-Fortran?problem?no?idea??????????*/
??semid?=?semget(key?mysize?semflg);
??if?(semid?==?-1)
??{
????perror(0);
????fprintf(stderr“%s?in?%s:?cannot?create?semaphores?\n“__FUNCTION____FILE__);
????fprintf(stderr“requested?size?was?%d\n“?mysize);
????exit(1);
??}
??/*????????‘1‘?--??The?shared?memory?segment?is?being?used.???????*/
??/*????????‘0‘?--??The?shared?memory?segment?is?freed.????????????*/
??/*?the?very?first?sempaphore?can?be??used?to?loc?all?others?
?????currently?this?is?not?entirely?thread?save?and?might?fail?if?no?barrier
?????is?used?before?this?lock?since?we?do?not
- 上一篇:《企業進銷存管理系統》論文范例
- 下一篇:旅游網站 asp 畢業設計
評論
共有 條評論