AIと戦って、あなたの人生のリスク診断 >>

以下のプログラムをLinuxで実行するとpthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまいます。(どちらにも『0』が入っててほしい)
何がやりたいのかというと、子スレッドのプライオリティを優先指定にして、子スレッドが生成されることを確認したいだけなのですが。。。
(下のプログラムじゃきっと本質的には確認できたことにはならないとおもいますが。。。)
何故pthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまうかわかる方、どなたかご教授願えませんでしょうか?
-------------------------------ここから-------------------------------
#include <pthread.h>
#include <errno.h>

void *test2( void * );


int main ( int argc, char **argv )
{
int iThCreateRes=0;
pthread_attr_t t_attr;
int bRet=0;
pthread_t szThreadHandle;

errno = 0;

pthread_attr_init( &t_attr );

pthread_attr_setdetachstate( &t_attr, PTHREAD_CREATE_JOINABLE );

pthread_attr_setschedpolicy( &t_attr,SCHED_RR );

pthread_attr_setinheritsched( &t_attr, PTHREAD_EXPLICIT_SCHED );

pthread_attr_setscope( &t_attr, PTHREAD_SCOPE_PROCESS );

iThCreateRes = pthread_create( &szThreadHandle, &t_attr, test2, (void *)777 );

if( iThCreateRes == 0 )
{
}

return ( bRet );
}
void *test2( void *iParam )
{
return (void*)0;
}
-------------------------------ここまで-------------------------------

このQ&Aに関連する最新のQ&A

A 回答 (2件)

asm/errno.hをみれば分かると思いますが、EINTRというエラーが発生しています。


通常、pthread_create()のエラーとしてはEINVALか、EAGAINがあります。
ざっくり、ソースを見たところ、pthread_create()の呼び出しで、引数に(void *)777と指定していますが、これが間違っているのでは?

int arg = 777;

iThCreateRes = pthread_create(&szThreadHandle, &t_attr, test2, (void *)&arg);

とやってみてください。
    • good
    • 0

errno = 4 が何を意味しているのか、調べましたか?

    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Q#defineの定数を文字列として読み込む

#define A "xxx"
#define B "yyy"
と定義しておいて

scanf("%s", str)
で読み込んだ文字列strが
"xxx"だった場合、"yyy"だった場合のように分岐したいのですが
このとき

if(str == "xxx")
のように中身を指定するのではなく

if(str == AA)
のように定数で分岐させることってできますか?

上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

Aベストアンサー

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょうか?

だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。

■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================

上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
   func( STR2MAC( str ) );
のような記述になります。

前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。

また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。

上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。

■サンプルソース
==============================
#include <stdio.h>
#include <string.h>

//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str

//プロトタイプ
void funcHoge( const char *str );

int main(void)
{
char sArg[128];

printf( "A or B ?>" );
scanf( "%s", sArg );

printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );

return 0;
}

void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================

■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx

≫実行その2≪
A or B ?>B
string1: B
string2: yyy

≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge

以上です。

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょう...続きを読む

QC言語の enum の使い方

インターネットのサイトなどを利用してC言語を勉強しています。 いま一通り基本的な勉強が済んだところですが、enum というユーザー定義変数をどんな風に使えばよいのか、今ひとつわかりません。サンプルコードなどを見ても、 enum でなくても配列を使えば出来そうなものが多いのですが、この型の変数はどう使えば効果的なのでしょうか。
詳しい方、どうかよろしく教えてください。

Aベストアンサー

>enum というユーザー定義変数を

変数ではないでしょう。
むしろ定数かと。

>enum でなくても配列を使えば出来そうなものが多いのですが

具体的になにがあります?
ちなみに配列ではありませんので誤解なきよう。

http://homepage2.nifty.com/well/enum.html
とか、いい感じに説明されていますかね。
defineだとただの置き換えなので何でも設定できてしまう。とか型チェックができない。とかの問題があります。

私自身、最近使ったやり方では…テーブルのインデックス用に使いましたね。


人気Q&Aランキング