0

私の問題は、パイプをリッスンできるように pthread を実行する必要があることです。問題は、構造体にパイプがあることです。

struct Pipefd {
    int tuberia1[2];
    int tuberia2[2];
};

これは私がpthreadを作成する方法です:

intptr_t prueba = pf.tuberia2[0];
pthread_create(NULL,NULL, listenProcess,reinterpret_cast<void*>(prueba));

そして、ここに私が呼び出すメソッドがあります:

void *listenProcess(void* x){

    int a = reinterpret_cast<intptr_t>(x);
    close(0);
    dup(a);

    string word;

    while(getline(cin,word)){

        cout << "Termino y llego: " << word << endl;

    }
}

コンパイルはできますが、セグメンテーション違反が発生しますが、理解できません。C ++の初心者です。すでに多くの検索を行っており、機能する答えが見つかりませんでした。「reinterpret_cast」は、エラーなしでコンパイルすることがわかった回避策です。

お時間をいただきありがとうございます。私の英語については申し訳ありません。それは私の母国語ではないので、あなたが指摘した文法エラーは、よく理解できます。

4

1 に答える 1

2

POSIX スレッド API を使用するとvoid*、スレッド関数が最初に呼び出されるときにユーザー データのジェネリックを渡すことができます。

すでに次の構造が定義されているため:

struct Pipefd {
    int tuberia1[2];
    int tuberia2[2];
};

この構造体の単一のフィールドをキャストするのではなくvoid*、実際の構造体へのポインターを渡したい場合があります。

void* ppf = reinterpret_cast<void *>(&pf);
pthread_create(NULL,NULL, listenProcess,ppf);

これで、変更されたスレッド関数は次のようになります。

void *listenProcess(void* x){
    Pipefd* ppf = reinterpret_cast<Pipefd *>(x);
    close(0);

    dup(ppf->tuberia2 [0]);

    string word;

    while(getline(cin,word)){
        cout << "Termino y llego: " << word << endl;
    }
}

アップデート:

への無効な呼び出しもありました。変数pthread_create (...)へのポインタを渡す必要があります。pthread_tこれにより、次の呼び出しによって発生したセグメンテーション違反が修正されますpthread_create (...)

void*     ppf = reinterpret_cast<void *>(&pf);
pthread_t tid;
pthread_create(&tid,NULL, listenProcess,ppf);
于 2013-11-09T01:48:16.917 に答える