hello,
I apply what we do in C but it does not work moreover I cannot do O_CREAT | O_RDWR
le resultat:
myPid--> 98118
mq_flags
mq_maxmsg
mq_msgsize
mq_curmsgs
Init--> 0 -- 9999 -- 1024 -- 0
mq_open
mqd_t--> -1 *****error
ctrl--> -1 *****error
getattr--> 0 -- 9999 -- 1024 -- 0
source:
posix
import strformat
let QUEUE_NAME = "QMname"
let MAX_MSG = 9999 # nbr max de message
let MSGTXTLEN = 1024 # msg text length
var myPid : Pid
var mqd_t : Mqd
var mqd_a : MqAttr
proc main() =
echo "getpid"
myPid = getpid()
echo fmt" myPid--> {myPid}"
# initialize the queue attributes
echo "mq_flags"
mqd_a.mq_flags = 0
echo "mq_maxmsg"
mqd_a.mq_maxmsg = MAX_MSG
echo "mq_msgsize"
mqd_a.mq_msgsize = MSGTXTLEN
echo "mq_curmsgs"
mqd_a.mq_curmsgs = 0
echo fmt"Init--> {mqd_a.mq_flags} -- {mqd_a.mq_maxmsg} -- {mqd_a.mq_msgsize} -- { mqd_a.mq_curmsgs}"
# create the message
echo "mq_open"
mqd_t = mq_open(QUEUE_NAME, O_RDWR) # impossible O_CREAT | O_RDWR
echo fmt"mqd_t--> {mqd_t}"
var ctrl = mq_getattr(mqd_t, mqd_a.addr)
echo fmt"ctrl--> {ctrl}"
echo fmt"getattr--> {mqd_a.mq_flags} -- {mqd_a.mq_maxmsg} -- {mqd_a.mq_msgsize} -- { mqd_a.mq_curmsgs}"
main()
compil :
[ "$mode" == "TEST" ] ; then
( set -x ; \
nim c -f --gc:orc -d:useMalloc --panics:on \
--hint[Performance]:off --warning[Deprecated]:on --warning[EachIdentIsTuple]:on \
--threads:on \
--passL:-no-pie \
-o:$projet_bin $projet_src ; \
)
fi
yes it compiles correctly but the execution is not correct result -1 in fact we cannot give permissions 0644 etc ...
regarde svp:
is good example:
https://www.softprayog.in/programming/interprocess-communication-using-posix-message-queues-in-linux
mqd_t = mq_open(QUEUE_NAME,O_CREAT or O_RDWR,0o644,null)
#or
mqd_a.mq_maxnmsg = 10
mqd_t = mq_open(QUEUE_NAME,O_CREAT or O_RDWR,0o644,mqd_a.addr)
min import posix
only :
mq_open(a1: cstring; a2: cint): Mqd {...}
https://github.com/nim-lang/Nim/blob/version-1-4/lib/posix/posix.nim#L249
my book development Linux
_open(const char *name,int flags, mode_t mode, struct mq_attr* attr);
very different from Nim
il ne faut pas definir une nouvelle proc: mq_open in posix.nim c'est varargs, alors elle va accepter (cstring,cint...)
You don't need a new proc: {.importc varargs.} procs accept multiple arguments. The documentation for posix could be revised to reflect that.
import posix, strformat
const QMname = "/QMname"
template check(assertion: untyped, msg: typed): untyped =
if not assertion: echo msg, &": {strerror(errno)}"
proc main() =
let attr = MqAttr(mq_maxmsg: 99, mq_msgsize: 1024)
let p_attr = attr.addr
let mq = mq_open(QMname, O_CREAT or O_RDWR or O_EXCL, 0o644, p_attr)
check(mq >= 0, "Error opening queue")
check(mq_getattr(mq, p_attr) >= 0, "Error getting attrs")
echo &"getattr--> {attr.mq_flags} -- {attr.mq_maxmsg} -- {attr.mq_msgsize} -- {attr.mq_curmsgs}"
#cleanup
dealloc(attr)
discard mq_close(mq)
discard mq_unlink(QMname)
main()