📄 test15_c.c
字号:
#include "test15.h"void resource_free();void sig_finish();void sig_kill();int shm_id;struct PInfo *shm_addr; int main(int argc, char *argv[]){ int sta; int i, num_x, num_f; shm_id = shmget(SHM_KEY, sizeof(struct PInfo)*5, IPC_CREAT|0600); if(shm_id == -1) /*创建共享内存,并获取id*/ { printf("shmget faild !!!\n"); exit(0); } shm_addr = (struct PInfo *)shmat(shm_id, 0, 0); if(!shm_addr) /*使求和进程与共享内存相连,并获取首地址*/ { printf("shmat faild !!!\n"); exit(0); } shm_addr[0].pid = getpid(); /*对共享内存中求和进程的状态进行初始化*/ shm_addr[0].pstatus = 'R'; shm_addr[0].num = atol(argv[1]); shm_addr[0].result = 0; signal(16, sig_finish); /*定义软中断处理函数*/ signal(17, sig_kill); while(1) { shm_addr[0].pstatus = 'P'; pause(); num_f = 0; num_x = 0; for(i=1; i<=4; i++) { if(shm_addr[i].pstatus == 'F') num_f++; if(shm_addr[i].pstatus == 'X') num_x++; } if(num_f == 4) /*若四个并行计算进程都计算完毕,则求和进程求和*/ { shm_addr[0].result = shm_addr[1].result + shm_addr[2].result + shm_addr[3].result + shm_addr[4].result; shm_addr[0].pstatus = 'F'; break; } else /*若四个并行计算进程都已退出运行,则求和进程退出*/ { if(num_f+num_x == 4) { shm_addr[0].pstatus = 'X'; break; } } } resource_free(); /*释放共享内存*/}/*void resource_free()返回值:无参数: 无函数功能:使求和进程与共享内存脱离,若没有其他进程使用共享内存,则将共享内存销毁。*/void resource_free(){ int sta; struct shmid_ds shm_buf; if(shmdt(shm_addr) == -1) printf("shmdt faild in resource_free() !!!\n"); sta = shmctl(shm_id, IPC_STAT, &shm_buf); /*获取共享内存状态*/ if(sta == -1) printf("shmctl faild in resource_free() !!!\n"); else { if(shm_buf.shm_nattch == 0) /*若已没有其他进程与共享内存相连*/ { sta = shmctl(shm_id, IPC_RMID, 0); /*将共享内存销毁*/ if(sta == -1) printf("shmctl faild in resource_free() !!!\n"); } }}/*void sig_finish()返回值:无参数: 无函数功能:收到并行计算进程发送的单个进程计算完毕或计算进程被杀死的信号时,所执行的软中断处理函数。*/void sig_finish(){ shm_addr[0].pstatus = 'R';}/*void sig_kill()返回值:无参数: 无函数功能:收到监控程序发送的令求和进程退出运行的信号时,执行的软中断处理函数。*/void sig_kill(){ shm_addr[0].pstatus = 'X'; resource_free(); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -