只有當代碼從.NET中呼叫時才會發生。當相同的代碼被編譯為C 控制臺應用程式,或從C 控制臺應用程式中呼叫時,它的運行沒有錯誤。
下面的代碼編譯了一個從.NET呼叫的C DLL,它列印出 "mq_open failed, code 1, message Operation not permitted":
extern "C" __attribute__((visibility("default") ) )
int mq_test()
{
const char* name = "/985a8e18-08ee-46e5-acf5-fc4f2ffb4df"/span>。
constexpr int oflag = O_RDWR | O_CLOEXEC | O_CREAT | O_EXCL。
constexpr mode_t mode = 0660;
mq_attr qa;
memset( &qa, 0, sizeof( qa );
qa.mq_maxmsg = 10;
qa.mq_msgsize = sizeof( void* ) 。
int fd = mq_open( name, oflag, mode, & qa );
if( fd >= 0 )
{
mq_unlink( name ) 。
printf( "mq_open completed OK
" )。)
return 0;
}
else; }
{
const int code = errno;
printf( "mq_open failed, code %i, message %s
", code, strerror( code ) ) 。
return -1。
}
然而,當從C 控制臺應用程式中呼叫同一個DLL時,它運行良好,并列印出 "mq_open completed OK":
//gcc load.cpp -ldl && ./a.out
我在同一個用戶賬戶下運行兩個程式,然而C 程式擁有所有必要的權限,而C#程式卻沒有。有什么辦法可以找出其中的原因嗎?
作業系統是Ubuntu 20.0。
作業系統是Ubuntu 20.04.3 LTS,架構是AMD64,.NET是5.0.9.
。uj5u.com熱心網友回復:
這是snap。微軟做出了一個有趣的選擇,將他們的.NET框架(旨在供軟體開發人員使用)放在一個沙盒內,將實際的作業系統隱藏在一個抽象概念的后面。
在引擎蓋下,該系統使用AppArmor內核模塊。這就是產生拒絕訪問狀態的原因。同樣,有趣的選擇,IMO SELinux通常更適合此類事情。
一旦我卸載了 .NET runtine 的 snap 包,并使用 apt-get 安裝了本地版本,我的代碼就開始正常作業了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/314102.html
標籤:
上一篇:如何對ruby??陣列進行分組
