高手大神们来帮小弟看个程序!急呀!!!
程序作用是:父进程创建一块共享内存,子进程接收输入的信息然后传给父进程。父进程显示接收到的信息,当接收到以end为前缀的字符串时,程序结束。
运行结果:
child begin:
please input your txt:
f begin:
zzzzzzzz
your msg:
please input your txt:
问题就在your msg:下面不能输出zzzzzzzz
另外我是在学校机房作实验,没有root权限,有关系么?
用gcc编译的
下面是代码:
/*
*file:sem2.c
*gcc sem2.c -o op2
*/
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<linux/sem.h>
#include<linux/shm.h>
#define BUFSIZE 2048
#define MAXTRY 20
int emptyid=1;
int fullid=0;
int main()
{
int child,i,j;
struct sembuf P,V;
union semun arg;
int shmid;
char *viraddr;
char buffer[BUFSIZE];
emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
arg.val=1;
if(semctl(emptyid,0,SETVAL,arg)==-1)
perror("semctl setval emptyid error.\n");
arg.val=0;
if(semctl(fullid,0,SETVAL,arg)==-1)
perror("semctl setval fullid error.\n");
P.sem_num=0;
P.sem_op=-1;
P.sem_flg=SEM_UNDO;
V.sem_num=0;
V.sem_op=1;
V.sem_flg=SEM_UNDO;
while ((child=fork())==-1);
if(child>0)
{ printf("f begin:\n");
for (i=0;i<20;i++)
{ semop(fullid,&P,1);
printf("your msg:\n%s\n",viraddr);
semop(emptyid,&V,1);
if(strncmp(viraddr,"end",3)==0)break;
}
wait(0);
shmdt(viraddr);
shmctl(shmid,IPC_RMID,0);
semctl(fullid,IPC_RMID,0);
semctl(emptyid,IPC_RMID,0);
printf("f exit...\n");
exit(0);
}
else
{
printf("child begin:\n");
for(j=0;j<20;j++)
{
semop(emptyid,&P,1);
printf("please input your txt:\n");
gets(buffer);
strcpy(viraddr,buffer);
semop(fullid,&V,1);
if(strncmp(viraddr,"end",3)==0)break;
}
printf("child exit...\n");
exit(0);
}
}