mq_unlink() always fails with EPERM

Christian Franke Christian.Franke@t-online.de
Fri Jan 17 15:16:57 GMT 2025


mq_unlink() does not unlink anything and always returns -1 with errno = 
EPERM.

Testcase:

$ uname -r
3.5.5-1.x86_64

$ cat mqunlink.c
#include <fcntl.h>
#include <mqueue.h>
#include <stdio.h>

int main()
{
   const char mq_name[] = "/mqtest";
   const struct mq_attr attr = { 0, 10, 42, 0 };
   mqd_t mq = mq_open(mq_name, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | 
S_IWUSR, &attr);
   if (mq == (mqd_t)-1) {
     perror("mq_open"); return 1;
   }
   mq_close(mq);
   if (mq_unlink(mq_name)) {
     perror("mq_unlink"); return 1;
   }
   return 0;
}

$ gcc -o mqunlink mqunlink.c

$ ./mqunlink
mq_unlink: Operation not permitted

$ ./mqunlink
mq_open: File exists

$ ls /dev/mqueue/
mqtest

$ rm /dev/mqueue/mqtest # Works on Linux
rm: cannot remove '/dev/mqueue/mqtest': Operation not permitted

$ cmd /c del 'C:\cygwin64\dev\mqueue\mqtest'
...

$ strace ./mqunlink
...
    49   50005 [main] mqunlink 17288 __set_errno: int unlink(const 
char*):1141 setting errno 1
    48   50053 [main] mqunlink 17288 unlink: -1 = 
unlink(/dev/mqueue/mqtest), errno 1
...
mq_unlink: Operation not permitted

-- 
Regards,
Christian



More information about the Cygwin mailing list