问个简单问题
#include <stdio.h>
#include <sys/msg.h>
struct msgform
{
long type;
int text;
};
main()
{
struct msgform msg;
char input[20];
char output[20];
int fd[2],msgid,pid,i,j;
while(pipe(fd)=fork())==-1);
while((pid=fork())==-1);
if(pid> 0)
{
for(i=0;i <5;i++)
{
printf( "\n parent input: \n ");
scanf( "%s ",input);
write(fd[1],input,5);
msg.type=1;
msg.text=i;
msgsnd(msgid,&msg,sizeof(int),0);
do
{
msgrcv(msgid,&msg,sizeof(int),2,0);
}
while(msg.text==i);
}
wait(0);
}
else if(pid==0)
{
for(j=0;j <5;j++);
{
do
{
msgrcv(msgid,&msg,sizeof(int),1,0);
}
while(msg.text==j);
read(fd[0],output,5);
printf( "child output:\n%s\n ",output);
}
}
exit(0);
}
我想做的是父进程产生一个子进程,父进程输入一行给管道,然后子进程从管道读取显示,做5次.用传递消息来控制同步,也就是父进程写一次,子进程才读一次,子进程读完父进程才再写
但是我执行后只有一次写和读,然后就没有输入提示了
希望能给我指出错误的地方
------解决方案--------------------个人感觉程序的do while部分有问题.
流程应该是这样的:
父进程写完管道, 发送一个 "写完 "消息, 如1, 阻塞(循环接收消息);
子进程读完管道, 发送一个 "读完 "消息, 如2, 阻塞(循环接收消息);
父进程接收到消息2, 开始写管道;
子进程接收到消息1, 开始读管道.
你的程序子进程只是接收消息, 没有发送, 父进程的阻塞会一直进行, 所以出问题.
还有一种办法是用sync系统调用, 具体查阅相关资料
------解决方案--------------------楼主的程序里没有建立消息队列的代码呀!
我只看在使用msgid,可是没有看到你给她赋值啊!
使用使用消息队列,一般需要的几个系统调用:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
1.建立消息队列
msgkey = ftok(...)
msgid = msgget(msgkey, ...)
2.使用
msgctl(msgid ...)
msgsnd(msgid, ...)
msgrcv(msgid, ...)
3.删除消息队列
msgctl(msgid, IPC_RMID, ...)
还是好好看看书吧!
推荐UNPV2 和 APUE2