msgsndからの無効な引数を引き起こす2つのフォークされたプロセス間のメッセージキュー

JDD

プログラムは2つの子プロセスを作成します。最初の子プロセス(1)は、stdinからテキストを読み取り、特別な文字を削除して、単語に分割します。プログラムのその部分は問題なく機能します。次に、子(1)が単語を分割している間、メッセージキューを介して各単語全体を送信します。この部分により、無効な引数エラーが発生します。子2は、画面に戻ってきたメッセージを印刷するだけです。

少なくとも、それが私がこの作業を計画した方法です。私はちょっと立ち往生していて、メッセージキューをデバッグする方法がよくわかりません。今、それはからエラーを投げています

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <error.h>
#include <stdlib.h>
#include <unistd.h> 
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <ctype.h>

# define QUEUE_PERMS 0644

static int message_queue = (int) 0;
static key_t key = (key_t) 0;

typedef struct message
{
  long mtype;
  char msg[100];
} mess_t;

int main(int argc, char *argv[]){

  const char delimiters[] = " ,.-!?()1234567890@#$%^&*\n";
  char *word = NULL;
  size_t buffer = 100;
  char *token;
  mess_t message;
  mess_t message2;
  int i;


  // set up a message queue
   key = ftok(__FILE__,'x');

  // create queue
   message_queue = msgget(key, QUEUE_PERMS | IPC_CREAT);
   if(message_queue == -1){
    perror("creating message queue");
   }

  // create parcer process. This tokenizes the strings
  // and send each work to the sort function(s)
  switch(fork()){
    case 0:
      // child process # 1 starts here
      key = ftok(__FILE__,'x');
      message_queue = msgget(key, QUEUE_PERMS);

      // splitting the words up here, this works fine 
      while(getline(&word, &buffer, stdin) != EOF){
        token = strtok(word, delimiters);
        while(token != NULL){
          for(i = 0; token[i]; i++){
            token[i] = tolower(token[i]);
          }
          // set type to 1 to send
          message.mtype = 1;
          // copy the word (token) over to the message struct
          strcpy(message.msg,token);

          // **** I get a send failed: Invalid argument here  *****
          if(msgsnd(key, &message, sizeof(message), MSG_NOERROR) == -1){
            perror("send failed");
          }
          token = strtok(NULL, delimiters);
        }
      }    
      break;

    case -1:
      perror("error fork\n");
      break;

    default:
      wait(NULL);
      break;
  }

  // this process should read the message an print it out
  switch(fork()){
    case 0:
    // child process # 2 starts here
      key = ftok(__FILE__,'x');
      message_queue = msgget(key, QUEUE_PERMS ); 
      msgrcv(key, &message2, sizeof(message),1, MSG_NOERROR); 
      printf("child process got %s\n", message2.msg);
      break;

    case -1:
      perror("error fork\n");
      break;

    default:
      wait(NULL);
      break;
  }

  return 0;
}
ジョナサン・レフラー

message_queueメッセージキューIDをmsgget()設定しますがメッセージキューIDmsgsnd()key代わりに使用して送信しようとします

あなたも同じ問題を抱えていmsgrcv()ます。

これら2つを修正すると、プログラムを実行できます。

$ ./mq
abelone apathy
child process got abelone
child process got apathy
$

abelone apathy1行で入力してControl-DからEOFを示します。

整理すると、読み取りプロセスが有効になる前に、書き込みプロセスがメッセージキューを埋めます。入力が大きすぎない限り、それは機能します。ただし、実際には2つのプロセスを同時に実行する必要があります。wait()並行性を与えるには、呼び出しを移動する必要があります(コードを関数に適切に分離することのもう1つの利点—可能な限り非表示にすると、そのような問題を見つけやすくなります。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

無効にされたAzure関数は、引き続きAzureストレージキューからメッセージをプルします

分類Dev

vfork()が親プロセスのクラッシュ(セグメンテーション違反)を引き起こすのはなぜですか?

分類Dev

無効な引数と識別子がメッセージキューのエラーを削除しました

分類Dev

Github:プッシュプロセスの低下を引き起こす大きなファイルのステージングを解除します

分類Dev

POSIXメッセージキュー-オープン時のエラー:無効な引数

分類Dev

WebDriverException:メッセージ:無効な引数:RaspberryPi3上のGeckoDriver、Selenium、Pythonでは終了したプロセスを強制終了できません

分類Dev

Rails 4のajaxフラッシュメッセージは、xhr以外のリクエストに対して奇妙な動作を引き起こします

分類Dev

adduserは、preinstスクリプトから呼び出されると奇妙なメッセージを引き起こします

分類Dev

クロスリンクされたdefstructがスタックオーバーフローを引き起こすのはなぜですか?

分類Dev

春のセキュリティ-エラーはパフォーマンスの問題を引き起こす

分類Dev

複数のタスクから呼び出されたパラメーターを使用した非同期メソッドが衝突を引き起こす

分類Dev

「修復されたレコード:/xl/styles.xml部分(スタイル)からのフォーマット」を引き起こすPOIExcelマージ

分類Dev

このネストされたジェネリックキャストがコンパイラエラーを引き起こすのはなぜですか

分類Dev

なぜこれがCスタックオーバーフローを引き起こすのですか?

分類Dev

Azure関数V2のメッセージを延期する:指定されたロックが無効です

分類Dev

スタックプッシュがセグメンテーション違反を引き起こすのはなぜですか?

分類Dev

サブセットselectステートメント内の貼り付け関数が単項演算子エラーに対して無効な引数を引き起こすのはなぜですか?

分類Dev

保護されていないブロードキャストは、アプリの起動時にクラッシュを引き起こします

分類Dev

IISがプールのリサイクル時に古いワーカープロセス(w3wp.exe)をクリーンアップしてWebサイトのメモリ不足の例外を引き起こさないのはなぜですか?

分類Dev

Ubuntu 20.04 LTSの起動時の無効化:「デフォルトのキーリング」にアクセスしたいがロックされているアプリケーションのキーリングのロックを解除する

分類Dev

MCHaskell関数がスタックオーバーフローを引き起こすのはなぜですか

分類Dev

定義された数のメッセージをメッセージキューから削除します

分類Dev

Azure Logicが「メッセージがキューで受信されたとき(ピークロック)」「次が利用可能」がキューメッセージを取得するのに長い間待機するのはなぜですか?

分類Dev

「指定されたロックが無効です」というメッセージが表示されるのはなぜですか。LockTockenを使用してキューメッセージを削除しようとするとエラーが発生します

分類Dev

コンピュータの再起動を引き起こすランダムなエラーメッセージ

分類Dev

かすれたスクリプトでメッセージのログを無効にすることはできません

分類Dev

RecyclerView:フォーカスの変化によって引き起こさ無効にスクロール

分類Dev

メッセージキューとしてのposixパイプ:ブロックされた書き込み+シグナルで何が起こるか

分類Dev

EC2サーバー上の複数のRubyプロセスが100%のCPU使用率を引き起こしているのはなぜですか?

Related 関連記事

  1. 1

    無効にされたAzure関数は、引き続きAzureストレージキューからメッセージをプルします

  2. 2

    vfork()が親プロセスのクラッシュ(セグメンテーション違反)を引き起こすのはなぜですか?

  3. 3

    無効な引数と識別子がメッセージキューのエラーを削除しました

  4. 4

    Github:プッシュプロセスの低下を引き起こす大きなファイルのステージングを解除します

  5. 5

    POSIXメッセージキュー-オープン時のエラー:無効な引数

  6. 6

    WebDriverException:メッセージ:無効な引数:RaspberryPi3上のGeckoDriver、Selenium、Pythonでは終了したプロセスを強制終了できません

  7. 7

    Rails 4のajaxフラッシュメッセージは、xhr以外のリクエストに対して奇妙な動作を引き起こします

  8. 8

    adduserは、preinstスクリプトから呼び出されると奇妙なメッセージを引き起こします

  9. 9

    クロスリンクされたdefstructがスタックオーバーフローを引き起こすのはなぜですか?

  10. 10

    春のセキュリティ-エラーはパフォーマンスの問題を引き起こす

  11. 11

    複数のタスクから呼び出されたパラメーターを使用した非同期メソッドが衝突を引き起こす

  12. 12

    「修復されたレコード:/xl/styles.xml部分(スタイル)からのフォーマット」を引き起こすPOIExcelマージ

  13. 13

    このネストされたジェネリックキャストがコンパイラエラーを引き起こすのはなぜですか

  14. 14

    なぜこれがCスタックオーバーフローを引き起こすのですか?

  15. 15

    Azure関数V2のメッセージを延期する:指定されたロックが無効です

  16. 16

    スタックプッシュがセグメンテーション違反を引き起こすのはなぜですか?

  17. 17

    サブセットselectステートメント内の貼り付け関数が単項演算子エラーに対して無効な引数を引き起こすのはなぜですか?

  18. 18

    保護されていないブロードキャストは、アプリの起動時にクラッシュを引き起こします

  19. 19

    IISがプールのリサイクル時に古いワーカープロセス(w3wp.exe)をクリーンアップしてWebサイトのメモリ不足の例外を引き起こさないのはなぜですか?

  20. 20

    Ubuntu 20.04 LTSの起動時の無効化:「デフォルトのキーリング」にアクセスしたいがロックされているアプリケーションのキーリングのロックを解除する

  21. 21

    MCHaskell関数がスタックオーバーフローを引き起こすのはなぜですか

  22. 22

    定義された数のメッセージをメッセージキューから削除します

  23. 23

    Azure Logicが「メッセージがキューで受信されたとき(ピークロック)」「次が利用可能」がキューメッセージを取得するのに長い間待機するのはなぜですか?

  24. 24

    「指定されたロックが無効です」というメッセージが表示されるのはなぜですか。LockTockenを使用してキューメッセージを削除しようとするとエラーが発生します

  25. 25

    コンピュータの再起動を引き起こすランダムなエラーメッセージ

  26. 26

    かすれたスクリプトでメッセージのログを無効にすることはできません

  27. 27

    RecyclerView:フォーカスの変化によって引き起こさ無効にスクロール

  28. 28

    メッセージキューとしてのposixパイプ:ブロックされた書き込み+シグナルで何が起こるか

  29. 29

    EC2サーバー上の複数のRubyプロセスが100%のCPU使用率を引き起こしているのはなぜですか?

ホットタグ

アーカイブ