微机原理 北科大 第七次试验文档格式.docx
《微机原理 北科大 第七次试验文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理 北科大 第七次试验文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
}
else{
close(fd[1]);
//这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据
n=read(fd[0],line,100);
write(STDOUT_FILENO,line,n);
exit(0);
ine,10
#include<
stdlib.h>
string.h>
sys/types.h>
sys/ipc.h>
sys/shm.h>
sys/sem.h>
errno.h>
#defineKEY_FILE"
/home"
#defineSHM_SIZE256
unionsemun{
intval;
/*valueforSETVAL*/
structsemid_ds*buf;
/*bufferforIPC_STAT&
IPC_SET*/
unsignedshort*array;
/*arrayforGETALL&
SETALL*/
};
intmain(void)
key_tshmkey=ftok(KEY_FILE,'
a'
key_tsemkey=ftok(KEY_FILE,'
b'
char*shmaddr;
intshmid;
intsem;
intsemid;
char*p;
unionsemunarg;
structsembufsops;
sops.sem_num=0;
sops.sem_op=0;
sops.sem_flg=SEM_UNDO;
shmid=shmget(shmkey,SHM_SIZE,IPC_CREAT|IPC_EXCL|0666);
if(shmid==-1)
if(errno!
=EEXIST)
perror("
shmget"
return-1;
}
shmid=shmget(shmkey,SHM_SIZE,0);
shmaddr=(char*)shmat(shmid,NULL,0);
if(shmaddr==(char*)-1)
shmat"
shmctl(shmid,IPC_RMID,NULL);
semid=semget(semkey,1,IPC_CREAT|IPC_EXCL|0666);
if(semid==-1)
if(errno!
semget"
return-1;
semid=semget(semkey,1,0);
sem=semctl(semid,0,SETVAL,1);
if(sem!
=0)
semctl"
p=shmaddr;
chars[10];
while
(1)
do
sem=semctl(semid,0,GETVAL,arg);
}while(sem==0);
sops.sem_op=-1;
sem=semop(semid,&
sops,1);
if(sem==-1)
semop1"
bzero(p,SHM_SIZE);
gets(s);
strcpy(p,s);
if(!
strcmp(s,"
quit"
))
{
semctl(semid,0,IPC_RMID);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,NULL);
return0;
}
sops.sem_op=1;
if(sem==-1)
{
perror("
semop2"
sleep
(1);
while(strlen(shmaddr)==0);
if(strcmp(p,"
)==0)
quit\n"
semop3"
printf("
%s\n"
shmaddr);
semop4"
sys/msg.h>
fcntl.h>
#definemax100
structhaha{
longmtype;
chardata[max];
intmain(intargc,char*argv[]){
intpid;
if(argc!
=2){
Usage:
msg[Message]\n"
}
key_tkey;
if((key=ftok("
/tmp"
'
g'
))<
0){//这里文件夹必须存在,有t属性并且上级目录也要有t属性
Gettingkeyerror!
\n"
intmgsid;
if((mgsid=msgget(key,IPC_CREAT|0666))==-1){//key值随便写一个数也能用
mgsqueuecreateerror\n"
pid=fork();
if(pid<
0){
forkcreateerror!
\n"
_exit
(1);
if(pid==0){
welcomeinchildprocess\nSendingthemessage......\n"
sleep
(1);
structhahahehe;
hehe.mtype=getppid();
strcpy(hehe.data,argv[1]);
if(msgsnd(mgsid,&
hehe,sizeof(hehe.data),0)<
//此处注意长度
Sendingerror!
!
}else{
Sendingcomplete!
_exit(0);
}else{
wait(NULL);
welcomeinparentsprocess\nReceivingthemessage......\n"
structhahagaga;
if(msgrcv(mgsid,&
gaga,max,getpid(),0)<
Receivingerror!
Receivingcomplete!
Themessageis%s\n"
gaga.data);
Work41.c
#include"
sem_com.h"
#defineDELAY_TIME3
intmain()
pid_tresult;
intsem_id;
sem_id=semget(ftok("
."
),1,0666|IPC_CREAT);
init_sem(sem_id,0);
result=fork();
if(result==-1)
Fork\n"
elseif(result==0)
{
Childprocesswillwatiforsomeseconds...\n"
sleep(DELAY_TIME);
Thereturnedvalueis%dinthechildprcess(PID=%d)\n"
result,getpid());
sem_v(sem_id);
else
sem_p(sem_id);
Thereturnedvalueis%dinthechildprocess(PID=%d)\n"
del_sem(sem_id);
exit(0);
sem_com.c
intinit_sem(intsem_id,intinit_value)
unionsemunsem_union;
sem_union.val=init_value;
if(semctl(sem_id,0,SETVAL,sem_union)==-1)
Initializesemaphore"
intdel_sem(intsem_id)
if(semctl(sem_id,0,IPC_RMID,sem_union)==-1)
Deletesemaphore"
intsem_p(intsem_id)
structsembufsem_b;
sem_b.sem_num=0;
sem_b.sem_op=-1;
sem_b.sem_flg=SEM_UNDO;
if(semop(sem_id,&
sem_b,1)==-1)
Poperation"
intsem_v(intsem_id)
sem_b.sem_op=1;
Voperation"
sem_com.h
#ifndef_SEM_COM_H_
#define_SEM_COM_H_
unionsemun{
intval;
externintinit_sem(intsem_id,intinit_value);
externintsem_p(intsem_id);
externintsem_v(intsem_id);
externintdel_sem(intsem_id);
#endif