メッセージキューは初めてです。基本的に私がここでやろうとしているのは、フォークしてユーザープロセスを作成することです。fork()の後、ユーザープロセスにメッセージを送信し、ユーザーメッセージからメッセージが返されるのを待ちます。実際のプログラムでは、while(1)を使用して、100個のユーザープロセスでこのようにループしています。一度に1つの特定のユーザープロセスからのみメッセージを送信および受信するようにするために、メッセージ受信の4番目の引数としてユーザープロセスPIDを使用し、メッセージを送信するときにメッセージタイプを= getpid()にします。無効な引数エラーが発生します。パーミッションビットを0666に変更しようとしましたが、これを行うと、プログラムは無限ループになります。パーミッションが0777の場合、次の結果が得られます。これが私がしたことの最小限の作業コードです。ヘッダーの長いリストを許してください。
oss.c
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/wait.h>
//global variables
int shmid;
int msgid;
key_t shmkey;
int currentprocessPID;
int key= 11223344;
void startprocess();
struct mesg_buffer {
long mesg_type;
int mesg_text[4];
} message;
/*mesg.text[0]-Stores PID
mesg.text[1]-stores CPU time used by process seconds
mesg.text[2]= stores CPU time used by process nanoseconds
*/
int main(int argc, char **argv)
{
if((msgid = msgget(key, 0777 | IPC_CREAT))==-1)
perror("error in msg get");
printf("going to fork");
pid_t pID = fork();
if (pID < 0)
{
perror("Failed to fork:");
exit(EXIT_FAILURE);
}
else if (pID == 0)
{
static char *args[]={"./user",NULL};
int status;
if(( status= (execv(args[0], args)))==-1)
{
perror("oss:failed to execv");
exit(EXIT_FAILURE);
}
else
printf("\n message sent to user sucessfully");
}
currentprocessPID=pID;
message.mesg_type = currentprocessPID;
if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
perror("error in sending message to user process");
else
{
printf("\nmessage sent to process %d",currentprocessPID);
}
if(msgrcv(msgid, &message, sizeof(message), currentprocessPID, 0)==-1)
perror("error in recieving message from user process");
else
{
int corpse,status;
while ((corpse = waitpid(message.mesg_text[0], &status, 0)) != message.mesg_text[0] && corpse != -1)
{
char pmsg[64];
snprintf(pmsg, sizeof(pmsg), "logParse: PID %d exited with status 0x%.4X", corpse, status);
perror(pmsg);
}
printf("\n%d process is done with its work",message.mesg_text[0]);
}
return 0;
exit(0);
}
user.c
//copy same headers as above
int shmid;
int key= 11223344;
struct mesg_buffer {
long mesg_type;
int mesg_text[4];
} message;
void main()
{
int pid=getpid();
printf("\n\nhello from %d",getpid());
int times=0,timen=0,zero=0,randomnum,timelimit,n=0,sum,i,locals=0,localn=0;
int msgid = msgget(key, 0666 | IPC_CREAT);
if(msgid==-1)
{
perror("User:error in message get");
exit(0);
}
if(msgrcv(msgid, &message, sizeof(message), pid, 0)==-1)
{
perror("User: Error in receieving message from OSS");
exit(0);
}
else
{
printf("\nIn User: Data received ");
message.mesg_type = pid;
message.mesg_text[0]=pid;
message.mesg_text[1] = locals;
message.mesg_text[2]=localn;
message.mesg_text[3]=1;
if( msgsnd(msgid, &message, sizeof(message), 0)==-1)
perror("error in sending message back to OSS");
exit(0);
}
exit(0);
}
これは私が得る出力です:
error in msg get: Permission denied
error in sending message to user process: Invalid argument
error in recieving message from user process: Invalid argument
going to fork
500行のような実際のプログラムでは、許可ビット0666を使用しました。そのプログラムでは、ユーザープロセスがossからメッセージを受信しようとすると、識別子が削除されたというエラーが発生します。
そのため、1日以上苦しんだ後(回答を調べた後)、私の教授は、メッセージキューが設定される前に、ユーザープロセスにメッセージを送信していると指摘しました。私がしなければならなかったのはsleep(1)を追加することだけでした。ossからメッセージが送信された後。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加