高手大神们来帮小弟看个程序!急呀!!!

zhu008008 2010-12-28 10:38:39
程序作用是:父进程创建一块共享内存,子进程接收输入的信息然后传给父进程。父进程显示接收到的信息,当接收到以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);
}
}

...全文
47 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhu008008 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]

没看到父进程在哪儿创建共享内存的..
[/Quote]

应该怎么改呢??
justkk 2010-12-28
  • 打赏
  • 举报
回复
没看到父进程在哪儿创建共享内存的..
zhu008008 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 justkk 的回复:]

至少你要调用shmget()创建一段共享内存吧
然后调用shmat()连接共享内存,
然后fork()
然后再是你的其它操作
[/Quote]

好啦,可以了,谢谢拉
justkk 2010-12-28
  • 打赏
  • 举报
回复
至少你要调用shmget()创建一段共享内存吧
然后调用shmat()连接共享内存,
然后fork()
然后再是你的其它操作

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧