代碼如下
#include"basic.h"
int main(int argc,char *argv[])
{
key_t key;
pid_t fpid;
int msgqid,ret;
MSG msg01;
char buf[150];
char *saveptr = NULL;
key = ftok("./test.txt",1);
if(-1 == key)
{
perror("ftok fail");
exit(-1);
}
ret = msgctl(4,IPC_RMID,NULL);//洗掉之前存在的訊息佇列
if(-1 == ret)
{
perror("msgctl fail");
exit(-1);
}
ret = 0;
msgqid = msgget(key,IPC_CREAT|S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if(-1 == msgqid)
{
perror("msgget fail");
exit(-1);
}
fpid = fork();
if(fpid < 0)
{
perror("fork fail");
exit(-1);
}
else if(0 == fpid)//子行程
{
while(1)
{
ret = 0;
sleep(5);
/*printf("輸入訊息型別:\n");
scanf("%ld",msg01.type);*/
printf("輸入訊息內容:(格式: 型別:發送人:內容)\n");
memset(buf,'\0',sizeof(buf));
scanf("%[^\n]",buf);
msg01.type = atol(strtok_r(buf,":",&saveptr));
strcpy(msg01.name,strtok_r(saveptr,":",&saveptr));
strcpy(msg01.text,saveptr);
printf("發送的訊息型別:%ld\n訊息的發送人:%s\n訊息內容:%s\n",msg01.type,msg01.name,msg01.text);
ret = msgsnd(msgqid,&msg01,sizeof(msg01.text),0);
if(-1 == ret)
{
perror("msgsnd fail");
exit(-1);
}
if(0 == strcmp(msg01.text,"end"))
{
break;
}
}
return 0;
}
else//父行程
{
while(1)
{
ret = 0;
ret = msgrcv(msgqid,&msg01,sizeof(msg01.text),-10,0);
if(-1 == ret)
{
perror("msgrcv fail");
exit(-1);
}
printf("收到的訊息型別:%ld\n訊息的發送人:%s\n訊息內容:%s\n",msg01.type,msg01.name,msg01.text);
printf("訊息接受完畢\n");
if(0 == strcmp(msg01.text,"end"))
{
break;
}
}
wait(NULL);
ret = 0;
ret = msgctl(msgqid,IPC_RMID,NULL);//洗掉訊息佇列
if(-1 == ret)
{
perror("msgctl2 fail");
exit(-1);
}
return 0;
}
return 0;
}
訊息結構
typedef struct msg
{
long type;
char text[100];
char name[20];
}MSG;
子行程發送訊息,父行程接受訊息,第一次可以運行,但第二次子行程輸入資訊后就卡住了,沒有任何反應,還有一個問題就是訊息內容:name丟失,求大佬解惑。
結果示意:
uj5u.com熱心網友回復:
父行程部分的break前面列印一句話,看下有可能break跳出來了uj5u.com熱心網友回復:
問題已解決,卡住原因是scanf("%[^\n]",buf);不知為何只能輸入一次,改為fgets輸入后問題解決。
丟包原因是msgsnd輸入引數有誤,改正后解決。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/66116.html
標籤:C語言
上一篇:如何用C語言設計程式?
下一篇:又是我,我又來了
