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
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 ...
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()
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 !!!!)
Partager