Bonjour: environnement: Linux Manjaro 20.1.2 XFCE GCC-LIBGCC-NIM

J'aimerais partager, j'ai été aidé j'ai passé plus de 48 heures d'affilée ....

Relier le livre de développement du système Linux C à Nim. Donc beaucoup de lecture, pour faire correspondre correctement les programmes, ainsi que passer de tableau en char * à cstring etc dans un tube qui fait ce qu'il veut ... j'ai aussi découvert le book-nim bien fait ...

J'ai démêlé .... mes tests ont été effectués en C / C ++ via NIM à l'identique VS-Code pour Nim et Geany pour C / C ++

Les commentaires sont dans le programme .... le programme pourrait être optimisé mais il est destiné à l'étude.

ouvrir et envoyer
qmsend.nim
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

import posix
import strformat
import unicode

let QUEUE_NAME  = "/QMname"   # slash required

let MAX_NMSG    = 50          # nbr max de message  attention 10 de base  voir kernel


let MSGLEN:int   = 2048       # msg text length --> Linux default 8192

var mqd_t : Mqd               # code retour mq_open       -1 error
var mqd_a : MqAttr            # attribut mqreceive

var bytes_send :cstring       # variable mq_receive

var mq_priority: int          # variable mqreceive priority

var send:cint                 # code retour mq_receive    -1 error

var ctrl : int                # code retour mq_getattr    -1 error






proc main() =
  
  # initialize the queue attributes
  
  mqd_a.mq_flags = 0          # 0 Normal O_NONBLOCK no block
  
  mqd_a.mq_maxmsg = 10        # max message next wait
  
  mqd_a.mq_msgsize = MSGLEN   # len mq_msgsize global général
  
  mqd_a.mq_curmsgs = 0        # nbr message dans la mq
  
  
  discard mq_unlink(QUEUE_NAME) # détache MQ
  discard mq_close(mqd_t)       # destroy MQ
  
  # create the message
  mqd_t =  mq_open(QUEUE_NAME,O_RDWR or O_CREAT,0o640,mqd_a.addr ) # umask 640 Linux manuel
  echo fmt"mqd_t--> {mqd_t}"
  
  
  # send message for test
  
  bytes_send = ""
  bytes_send = fmt"ôêèéîà123456"
  send = mq_send(mqd_t, bytes_send,len($bytes_send), 12);
  echo fmt"{bytes_send}   {runeLen($bytes_send)}   {len($bytes_send)}"
  
  
  bytes_send = fmt"Bonjour"
  send = mq_send(mqd_t, bytes_send,runeLen($bytes_send),20)
  echo fmt"{bytes_send}   {runeLen($bytes_send)}"
  
  for i in 1..4:
    bytes_send = ""
    bytes_send = fmt"message num:{$i}"
    send = mq_send(mqd_t, bytes_send,runeLen($bytes_send), 15)
    echo fmt"{bytes_send}   {runeLen($bytes_send)}"
  
  bytes_send = ""
  bytes_send = fmt"exit"
  send = mq_send(mqd_t, bytes_send,runeLen($bytes_send), 10);
  echo fmt"{bytes_send}   {runeLen($bytes_send)}"
  
  ctrl = mq_getattr(mqd_t, mqd_a.addr)
  echo fmt"ctrl--> {ctrl}"
  echo fmt"getattr-->  mqd_a.mq_flag={mqd_a.mq_flags} -- mqd_a.mq_maxmsg={mqd_a.mq_maxmsg} -- mqd_a.mq_msgsize={mqd_a.mq_msgsize} -- mqd_a.mq_curmsgs={ mqd_a.mq_curmsgs}"

main()

-------------------------------------------------- -------------------

recevoir et fermer mq

qmreceive.nim

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

import posix
import strformat

let QUEUE_NAME  = "/QMname"

let MSGTXTLEN:int   = 2048    # msg text length --> Linux default 8192

var mqd_t : Mqd               # key mqreceive

var mqd_a : MqAttr            # attribut mqreceive

var tab: array[0..128, char]  # variable mqreceive buffer spécifique

var mq_priority: int          # variable mqreceive priority

var rcv : int                 # code retour mq_receive    nbr byte

var ctrl : int                # code retour mq_getattr    -1 error

var rlen* : int               # variable mqreceive len

var rcv_val: string           # zone de travail


# détricotte buffer mqueue
func mqBuffer(a1: array[0..128, char]) : string =
  var i = 0
  while a1[i] != '\x00':
      result.add( $a1[i] )
      inc(i)


proc main() =
  
  # create the message
  mqd_t =  mq_open(QUEUE_NAME,O_RDWR)
  echo fmt"mqd_t--> {mqd_t}"
  
  ctrl = mq_getattr(mqd_t, mqd_a.addr)
  
  while mqd_a.mq_curmsgs > 0:
    
    ctrl = mq_getattr(mqd_t, mqd_a.addr)
    for i in 0..127 :  tab[i] ='\x00'
    rlen = mqd_a.mq_msgsize
    mq_priority= 999
    rcv = mq_receive(mqd_t, tab.addr, rlen,mq_priority)
    rcv_val = mqBuffer(tab)
    
    ctrl = mq_getattr(mqd_t, mqd_a.addr)
    #echo fmt"tab--> {$tab}"
    echo fmt"rcv--> {rcv}   bytes_read={$rcv_val}<-- len={len(rcv_val)}  q_priority={mq_priority}"
    #echo fmt"getattr-->  mqd_a.mq_flag={mqd_a.mq_flags} -- mqd_a.mq_maxmsg={mqd_a.mq_maxmsg} -- mqd_a.mq_msgsize={mqd_a.mq_msgsize} -- mqd_a.mq_curmsgs={ mqd_a.mq_curmsgs}"
  
  
  discard mq_unlink(QUEUE_NAME) # détache MQ
  discard mq_close(mqd_t)       # destroy MQ

main()
intérêt: par exemple pour avoir des tables " vue / liste / mise à jour " indépendantes et pouvoir communiquer avec les programmes maîtres, on peut aussi un serveur de messagerie ( pas @mail)qui se chargera de lancer les jobs et de paramétrer correctement, etc ...

Ma prochaine chose serait de faire un vrai traitement parallèle ou plutôt de pouvoir ouvrir des programmes interactifs indépendamment du parent qui le lance et vice versa.

@bientôt

ps je suis pas content parce que l'on ne perçois pas les indetations (sauf en copiant !!!!)