私はfork()を使ってメッセージキューを実装しようとしています。ここに私が持っているものがあります。fork()の使い方が間違っていますか?
#define DATA_SIZE 256
#define BUFF_SIZE 4096
int main(void) {
// seed the random number generator
srand(time(NULL));
// Parent and Ground Truth Buffers
char ground_truth[BUFF_SIZE] = {0}; // used to verify
char producer_buffer[BUFF_SIZE] = {0}; // used by the parent
int i = 0;
int msqid = 0;
int rc;
pid_t msq_pid;
for (i = 0; i < BUFF_SIZE; ++i) {
producer_buffer[i] = ground_truth[i] = rand() % 256;
}
const key_t s_msq_key = 1337; // used to create message queue ipc
const char *const p_msq_key = "/OS_MSG";
msqid = msgget(s_msq_key, IPC_CREAT | 0660);
msq_pid = fork();
if(msq_pid == -1){
perror("error forking");
exit(1);
}
if(msq_pid > 0){
rc = msgsnd(msqid, (void*)p_msq_key, sizeof(producer_buffer), 0);
printf("MESSAGE SENT\n");
if(rc < 0){
perror("message send failed");
exit(1);
}
return 1;
} else {
if(memcmp(producer_buffer, ground_truth, DATA_SIZE) == 0){
printf("MESSAGE REC");
return 1;
}
exit(1);
}
return 0;
}
私の実際の問題が追加されました。うまくいけば、これはあまりあまりありません。これは宿題ですが、コードの助けを求めるだけではありません。もう一度、私は取得しています唯一の結果がMESSAGE REC
はなくMESSAGE REC
EDIT続いMESSAGE SENT
です:
さて、私はmsq_pid == -1
のためのエラーチェックを追加しました。また、仮想マシンを再起動すると、MESSAGE SENT
とMESSAGE REC
の両方を取得できたことに気付きました。プログラムをさらにいくつか実行した後、私はMESSAGE REC
を受信し始めました。誰かがこれを説明できますか?
私たちが問題を示すコンパイルできる短いプログラム全体を投稿してください。 –
そのコードが 'main'にある場合、それはうまくいくはずです(最初の' printf'の終わりに '\ n'を付けるべきです)。サブルーチンに移動した場合は、十分なコードが表示されていません。 – user3386109
私はすべての論理を含むように問題を編集しました。 –