Linuxメッセージキューとスレッドインスタンスの理解


 , , , , 。

スレッドの作成
 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

ここでthreadはスレッドIDアドレスattrが属性設定start_routineが関数ポインタargがstart_routine関数のパラメータ
スレッドを終了
void pthread_exit(void *retval);

ここでretvalはメインスレッドに返されるパラメータです
スレッド終了待ち
int pthread_join(pthread_t thread, void **retval);

ここでthreadはスレッドid retvalが取得したスレッド終了後のパラメータである
例:メッセージキュー月間スレッドによる2つのプロセスの相互転送と印刷
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
struct msgbuf
{
    long mtype;
    char mtex[40];
};

int msid;
struct msgbuf msre,mswr;

void * f(void * buf)
{
    while(1)// 
    {
        bzero(msre.mtex,40);
        if(msgrcv(msid,&msre,sizeof(msre),100,0)==-1)// msid , (mtype) 100 , msre , 
        {
            perror("get massage fail");
            exit(-1);
        }
        printf("massage : %s
"
,msre.mtex); if(strcmp(msre.mtex,"end")==0) { msgctl(msid,IPC_RMID,NULL); exit(0); } printf("Please import massage or wait for massage:
"
); } } int main (void) { key_t key = ftok(".",123); msid = msgget(key,IPC_CREAT|0666); if(msid<0) { perror("get msgid fail"); return ; } mswr.mtype = 200; char a[40] = {'\0'}; pthread_t id; pthread_create(&id,NULL,f,NULL); printf("Please import massage or wait for massage:
"
);// while(1)// { bzero(mswr.mtex,40); gets(a); stpcpy(mswr.mtex,a); if(msgsnd(msid,&mswr,strlen(mswr.mtex),0)==-1)// mswr msid strlen, { perror("send fail"); return 0; } if(strcmp(msre.mtex,"end")==0) { msgctl(msid,IPC_RMID,NULL); exit(0); } printf("Please import massage or wait for massage:
"
); } pthread_join(id,NULL); }