0

我有一個任務,在freebsd中使用raymond的算法構建對分佈式互斥的支持。在freebsd中使用內核線程的正確方法

這需要內核線程始終在udp端口上偵聽來自其他系統的消息並相應地執行操作。

我使用thread_create創建了一個線程,但每次調用socreate時都會創建一個內核恐慌。 做我在做什麼的最佳方式是什麼?我在freebsd的內核網絡上找不到任何好的教程。

另一方面,也許mainproc變量設置不正確。如何找到當前的struct proc*struct thread*

我當前的代碼是這樣的:

static struct proc *mainproc; 
static int val; 
static int main_thread_finish; 

static struct socket *listenso; 
static struct sockaddr_in listenadr; 

static void main_thread(void* data) 
{ 
    static int res; 
    printf("In thread\n"); 
    res = socreate(AF_INET, &listenso, SOCK_DGRAM, IPPROTO_UDP, mainproc->p_ucred, mainproc->p_singlethread); 
    printf("socreate res: %d\n", res); 

    listenadr.sin_family = AF_INET; 
    listenadr.sin_port = htons(1234); 
    listenadr.sin_addr.s_addr = 0; 
    res = sobind(listenso, (struct sockaddr*)&listenadr, mainproc->p_singlethread); 
    printf("bind res: %d\n", res); 

    while(!main_thread_finish) 
    { 
      pause("DUMMY", hz); 
    } 
    printf("kthread exiting...\n"); 
    kthread_exit(); 
} 

static int 
raymond_module_load(struct module *module, int cmd, void *arg) 
{ 
    int error = 0; 

    switch (cmd) { 
    case MOD_LOAD : 
      val = 12345; 
      main_thread_finish = 0; 
      kproc_create(main_thread, NULL, &mainproc, 0, 0, "raymond_main_thread"); 
      printf("Module loaded - kthread created\n"); 
      break; 
    case MOD_UNLOAD : 
      main_thread_finish = 1; 
      printf("Waiting for thread to exit...\n"); 
      pause("TWAIT", 3*hz); 
      printf("Module unload...\n"); 
      break; 
    default : 
      error = EOPNOTSUPP; 
      break; 
    } 
    return (error); 
} 

static moduledata_t raymond_module_data = { 
    .name = "raymond_module", 
    .evhand = raymond_module_load, 
    .priv = NULL }; 

DECLARE_MODULE(raymond_module, raymond_module_data, SI_SUB_KLD, SI_ORDER_ANY); 

回答

1

致電socreate恐慌,因爲mainproc->p_singlethreadNULL。此變量不是與進程關聯的線程,但用於在進程內強制執行「單線程」(有關更多詳細信息,請參見中的函數thread_single())。

你想做的事是什麼可能是使用curthread

res = socreate(AF_INET, &listenso, SOCK_DGRAM, IPPROTO_UDP, 
      curthread->td_ucred, curthread); 
... 
res = sobind(listenso, (struct sockaddr*)&listenadr, curthread); 
1

考慮使用的netgraph,它準備使用ng_ksocket模塊。

相關問題