Rumah > Artikel > pembangunan bahagian belakang > Mengapakah \'setns\' Gagal dengan EINVAL dalam Persekitaran Go Multithreaded?
Apabila cuba memanggil 'setns' daripada Go untuk memasuki MNT ruang nama, panggilan secara konsisten mengembalikan EINVAL. Isu ini diperhatikan walaupun pelaksanaan C dengan fungsi yang sama berfungsi dengan betul.
Isu ini berpunca daripada fakta bahawa Go ialah bahasa berbilang benang, manakala 'setns' menjangkakan dipanggil daripada konteks satu utas. Apabila dipanggil dari persekitaran berbilang benang, 'setns' gagal mengaitkan urutan semasa dengan ruang nama sasaran dengan betul.
Penyelesaian kepada masalah ini adalah dengan menggunakan "Helah pembina CGO." Teknik ini membolehkan anda menentukan fungsi C untuk dilaksanakan sebelum masa jalanan Go dimulakan. Dengan menggunakan pendekatan ini, fungsi C anda boleh memanggil 'setns' sebelum urutan Go dibuat, memastikan bahawa panggilan dibuat dalam konteks satu thread.
<code class="go">/* #include <sched.h> #include <stdio.h> #include <fcntl.h> __attribute__((constructor)) void enter_namespace(void) { setns(open("/proc/<PID>/ns/mnt", O_RDONLY, 0644), 0); } */ import "C" ... rest of file is unchanged ... </code>
Ingat untuk menggantikan pemegang tempat
Pendekatan ini mempunyai beberapa batasan:
Tampalan kepada 'setns(2)' mengesahkan keperluan untuk pelaksanaan satu benang dalam persekitaran berbilang benang. Proses yang mempunyai keupayaan juga mesti mempunyai CAP_SYS_CHROOT dan CAP_SYS_ADMIN dalam ruang nama pengguna mereka sendiri dan CAP_SYS_ADMIN dalam ruang nama pelekap sasaran.
Atas ialah kandungan terperinci Mengapakah \'setns\' Gagal dengan EINVAL dalam Persekitaran Go Multithreaded?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!