2017-03-23 7 views
0

私はプログラム名test.cを書きます。このプログラムでは、pthead_createによって3つのスレッドを作成しました。これらのスレッドは、prctl(PR_SET_NAME、name)によるthread0、thread1、thread2という名前です。スレッド関数のコードは次のとおり新しいユーザー空間を作成すると、カーネルのプロセスリストに表示されますか?

void *output(void *arg) { 

      char *x = (char *) arg; 
      char name[40] = "thread"; 
      strcat(name, x); 
      prctl(PR_SET_NAME, name); 
      while(1){ 
        printf("%s\n", name); 
        sleep(10000); 
      }; 
    } 

それから関数が各task_struct INFOMATIONのINTカーネルプロセスリストを印刷するカーネルモジュールprint.cを書き込みます。

struct task_struct *task = &init_task; 

    do{ 
      printk("%s\n", task->comm); 
    }while((task=next_task(task)) != &init_task); 

私はプログラムtest.cを正しく実行してから、モジュールprint.koを正しくinsmodします。間違いなく、私は3つのスレッドの情報が見つかりませんでした。ですから、pthread_createによって作成されたスレッドは、カーネルのプロセスリストには表示されません。この意見は正しいのですか?

+0

なぜプロセスリストにスレッドが表示されると思いますか? – StoryTeller

+1

@StoryTeller Linuxでは、ユーザー空間スレッドはカーネルプロセスなので、これは履歴(プロセスとカーネルスケジューリングエンティティを区別するカーネルの前から)の遺物であるが、それはそのものであり、我々はそれを生きなければならない。 –

+0

@DavidSchwartz - LinuxThreadsがpthreadsの実装を廃止したことは知っています。それは今日でもまだそうですか? – StoryTeller

答えて

0

スレッドはまた、カーネル内でstruct taskで表されます。たとえば、タスクの各スレッドを反復することができます。マクロwhile_each_thread

struct task_struct *task = ...; 
struct task_struct *t = task; 
do { 
    //use t 
} while_each_thread(task, t); 

注:いずれかの場合、私はあなたがこのようにそれらを反復処理できるようにする必要があり、タスク構造体の周りに、適切なロックを知りません。

関連する問題