Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 17 h 47 m 12 s |
|
|
New sujet, voir page 3, dernier post!
Voila, j'ai 2 programmes, client et serveur, qui tournent sur une meme machine mais sur 2 terminaux differents.
Le serveur demarre, donne son pid et attend.
On demarre le client en lui passant comme parametres le pid du serveur et une chaine de caractere, et il envoie cette chaine au serveur qui l'affiche. Une fois affichee, le client sort et le serveur attend une nouvelle chaine d'un nouveau client (il sors jamais lui).
Seulement voila : quand je passe des chaines de caractere inferieures a une certaine taille (aleatoire), ca va, mais si la chaine est trop grande, alors un signal de continuation envoye au client par le serveur n'est pas intercepte et le client se met en pause. Voyez vous d'ou cela peut venir?
|
|
| |
Message édité 3 fois, la dernière par Woofy le 26 novembre 2004 - 13 h 25. |
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 17 h 54 m 03 s |
|
|
Bon, l'edition a vire des backslash, je remet le code ici :
Serveur :
1. /*
2. ** serveur.c for minitalk in /u/ept3s/nicola_f/rendu/c/minitalk
3. **
4. ** Made by florian nicolais
5. ** Login <nicola_f@epita.fr>
6. **
7. ** Started on Mon Nov 22 16:53:18 2004 florian nicolais
8. ** Last update Tue Nov 23 17:08:40 2004 florian nicolais
9. */
10.
11. #include <signal.h>
12. #include <unistd.h>
13. #include <stdlib.h>
14. #include "my.h"
15.
16. int pid_client;
17.
18. void print_pid()
19. {
20. my_putstr("pid = ");
21. my_put_nbr(getpid());
22. my_putchar('\n');
23. }
24.
25. void add_str(int b)
26. {
27. static int count = 7;
28. static char str[7];
29.
30. str[count - 1] = b + '0';
31. count--;
32. if (count == 0)
33. {
34. if ((my_strcmp(str, "1111111")) == 0)
35. {
36. str[7] = '\0';
37. count = 7;
38. my_putchar('\n');
39. serveur(0);
40. usleep(1);
41. kill(pid_client, SIGUSR1);
42. return;
43. }
44. else
45. {
46. str[7] = '\0';
47. count = 7;
48. my_putchar(conv_bin_to_dec(str));
49. }
50. }
51. kill(pid_client, SIGUSR1);
52. }
53.
54. int add_str0()
55. {
56. add_str(0);
57. return (0);
58. }
59.
60. int add_str1()
61. {
62. add_str(1);
63. return (0);
64. }
65. int client_pid(int i)
66. {
67. static int clientpid = 0;
68. static int old = 0;
69. static int exp = 1;
70. static int fin = 0;
71. int tmppid;
72.
73. if (old == i && i == 1)
74. fin++;
75. if (fin >= 5)
76. {
77. pid_client = clientpid;
78. clientpid = 0;
79. exp = 1;
80. old = 0;
81. fin = 0;
82. serveur(1);
83. }
84. else
85. {
86. if (i == 0)
87. clientpid += exp;
88. else
89. exp *= 10;
90. old = i;
91. }
92. return (0);
93. }
94.
95. int client_pid0()
96. {
97. client_pid(0);
98. return (0);
99. }
100.
101. int client_pid1()
102. {
103. client_pid(1);
104. return (0);
105. }
106.
107.
108.
109. int serveur(int configuration)
110. {
111. if (configuration == 0)
112. {
113. signal(SIGUSR1, client_pid0);
114. signal(SIGUSR2, client_pid1);
115. return (0);
116. }
117. if (configuration == 1)
118. {
119. signal(SIGUSR1, add_str0);
120. signal(SIGUSR2, add_str1);
121. usleep(1);
122. kill(pid_client, SIGUSR1);
123. return (0);
124. }
125. }
126.
127. int main()
128. {
129. print_pid();
130. serveur(0);
131. while (1)
132. pause();
133. return (0);
134. }
135.
Client :
1. /*
2. ** client.c for minitalk in /u/ept3s/nicola_f/rendu/c/minitalk
3. **
4. ** Made by florian nicolais
5. ** Login <nicola_f@epita.fr>
6. **
7. ** Started on Mon Nov 22 16:36:25 2004 florian nicolais
8. ** Last update Tue Nov 23 17:12:13 2004 florian nicolais
9. */
10.
11. #include <signal.h>
12. #include <errno.h>
13. #include <stdlib.h>
14. #include "my.h"
15.
16.
17.
18. void print_error(char *error_msg)
19. {
20. my_putstr(error_msg);
21. my_putchar('\n');
22. exit(1);
23. }
24.
25. int send_pid(int servpid)
26. {
27. int i;
28. int clientpid;
29. int count;
30. int exp;
31.
32. clientpid = getpid();
33. while (clientpid > 0)
34. {
35. count = 0;
36. while (count < clientpid % 10)
37. {
38. kill(servpid, SIGUSR1);
39. usleep(1);
40. count++;
41. }
42. kill(servpid, SIGUSR2);
43. usleep(1);
44. clientpid /= 10;
45. }
46. for (i = 0; i < 5; i++)
47. {
48. usleep(1);
49. kill(servpid, SIGUSR2);
50. }
51. pause();
52. }
53.
54. int send_char(int pid, char *bin)
55. {
56. int i;
57. int sig;
58.
59. i = 8;
60. while (i > 1)
61. {
62. if (bin[i - 1] == '0')
63. sig = SIGUSR1;
64. else
65. sig = SIGUSR2;
66. if (kill(pid, sig) == -1)
67. {
68. my_putstr(strerror(errno));
69. print_error("Error while sending message! Abording");
70. }
71. // my_putstr("pause\n");
72. pause();
73. // my_putstr("finpause\n");
74. i--;
75. }
76. return (0);
77. }
78.
79. int next()
80. {
81. ;
82. }
83.
84. int main(int ac, char **av)
85. {
86. int i;
87. int j;
88. int pid;
89. char *nb_bin;
90.
91. if (ac != 3)
92. print_error("USAGE : client [id server] [char text]");
93. if (!my_str_isnum(av[1]))
94. print_error("id server must be a integer");
95. pid = atoi(av[1]);
96. i = 0;
97. signal(SIGUSR1, next);
98. send_pid(pid);
99. while (av[2][i])
100. {
101. j = 0;
102. nb_bin = conv_to_bin(av[2][i]);
103. send_char(pid, nb_bin);
104. i++;
105. }
106. send_char(pid, "11111111");
107. return (0);
108. }
|
|
| |
Totalement inutile, donc completement indispensable 
|
Petit_PimoOosE
rsqrtps & pshufb
Messages : 4 617 Inscrit le 15/06/03
Ville : Montréal
Non connecté
|
|
Posté le 23 novembre 2004 - 18 h 51 m 56 s |
|
|
euh...
je ne comprends pas comment tu envoies les PID et la chaîne de caractère! ! uniquement en envoyant des signaux ?
|
|
| |
Message édité 1 fois, la dernière par Petit_PimoOosE le 23 novembre 2004 - 18 h 52. |
| |
Huile de fraise.
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 08 m 55 s |
|
|
Oui.
Le pid est code de la facon suivante :
Je prend le premier digit, et j'envoie N fois le signal SIGUSR1 (si le digit est 4, je l'envoie 4 fois).
Pour passer au digit suivant, j'envoie le signal SIGUSR2. Si le digit est a 0, alors j'envoie juste le signal SIGUSR2.
Pour dire que j'ai fini d'envoyer la chaine, j'envoie 5 fois le signal SIGUSR2 (afin de ne pas confondre avec un pid qui serais de la forme 30000 par exemple).
Pour envoyer les caracteres, je les codes en binaire, et j'envoie SIGUSR1 pour les 0 et SIGUSR2 pour les 1. Ils sont codees non pas sur 1 octet, mais sur 7 bits (ca va de 32 a 126 il me semble).
Les fonctions conv_to_bin et conv_bin_to_dec assurent la conversion et la deconversion binaire/decimale.
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 15 m 20 s |
|
|
man kill devrait te donner des infos, non ? mettre en branle ce genre de mécanisme n'est pas gratuit du tout. Tu imagines pas tout ce que ça déclenche d'envoyer des signaux ! Mais là, c'est plus du C (le C il sait pas ce que c'est un signal), c'est de l'Unix pur et dur
sinon, pour que ça aille plus vite, envoie un kill -9
|
|
| |
Message édité 2 fois, la dernière par bernie38 le 23 novembre 2004 - 21 h 16. |
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 18 m 17 s |
|
|
Ouais mais non, en fait le probleme que j'ai, c'est que le signal se transmet plus vite que le code ne s'ecoule, d'ou le fait qu'il n'arrive pas a l'instruction pause avant que le signal n'arrive (c'est tres con, ca corse l'affaire).
Enfin bon, une modification de mon client qui declenchera la generation et l'envoi du signal sur reception du signal du serveur devrais resoudre l'affaire.
|
|
| |
Totalement inutile, donc completement indispensable 
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 19 m 36 s |
|
|
Le 23 novembre 2004 - 21 h 15, bernie38 a écrit :
man kill devrait te donner des infos, non ? mettre en branle ce genre de mécanisme n'est pas gratuit du tout. Tu imagines pas tout ce que ça déclenche d'envoyer des signaux ! Mais là, c'est plus du C (le C il sait pas ce que c'est un signal), c'est de l'Unix pur et dur
sinon, pour que ça aille plus vite, envoie un kill -9 
|
J'ai hesite... voir meme un kill -9 -1... mais en fait non! 
Sinon, ce que je voulais faire aussi, c'etait utiliser 127 signaux differents et assigner un caractere a chacun!
Ben y a pas assez de signaux!
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 21 m 14 s |
|
|
Le 23 novembre 2004 - 21 h 18, Woofy a écrit :
Ouais mais non, en fait le probleme que j'ai, c'est que le signal se transmet plus vite que le code ne s'ecoule, d'ou le fait qu'il n'arrive pas a l'instruction pause avant que le signal n'arrive (c'est tres con, ca corse l'affaire).
Enfin bon, une modification de mon client qui declenchera la generation et l'envoi du signal sur reception du signal du serveur devrais resoudre l'affaire.
|
donc, c'est pas du tout un problème de C, mais d'Unix. Et faudrait bien connaître le mécanisme des signaux, mettre des wait, ou quelque chose comme ça, et c'est pas facile facile...
Sinon, faudrait peut-être utiliser un pipe, mais là encore, c'est chaud.
Et y'a pas mal de temps que j'ai pas utilisé des signaux, moi, faudrait que je m'y remette, tiens. Désolé de pas pouvoir t'aider...
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 23 m 49 s |
|
|
po grave, faut bien que je trouve!
Mais bon, vais essayer mon truc et on va voir.
Si ca marche, me reste plus qu'a compiler sans warning sous sun et alpha, et c'est bon!
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 25 m 15 s |
|
|
bon courage ! je vois que tu es morpion, tu t'accroches à mort, et dans ce genre d'affaire c'est la qualité numéro 1
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 27 m 48 s |
|
|
Je viens d'avoir une idee mega geniale!
On n'a le droit qu'a une unique variable globale!
Ben moi mon unique variable globale, ca sera.... UNE STRUCTURE!!! 
Comme ca je pourrais mettre dedans le pid du serveur et la chaine a envoyer!
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 30 m 45 s |
|
|
Dit moi bernie, je sais que tu est pas un boss du C, que pense tu de mon niveau sachant que ca fait que 2 mois... 1 mois et demi pardon que je fait du C?
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 34 m 50 s |
|
|
dur à dire, le C est un langage difficile, et dans ce que tu fais tu mets en oeuvre plein d'autres notions (Unix par exemple)
Et en plus, je m'aventurerais pas à juger (ou noter) quelqu'un, tout ce que je peux dire d'un programme c'est s'il est lisible, maintenable et respectant la norme (et encore, là,  )
Sinon, je trouve que tu te débrouilles pas mal du tout, mais c'est surtout parce que tu te contentes pas apparament de repomper des trucs sur le net sans les comprendre, et ça c'est un excellent début !
EDIT : En gros, tu bosses pour comprendre et y arriver, donc je pense que tu y arriveras. Faut dire que dans ton école, doit pas trop y avoir la place pour les glandeurs, hein ?
|
|
| |
Message édité 1 fois, la dernière par bernie38 le 23 novembre 2004 - 21 h 35. |
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 38 m 56 s |
|
|
pas trop, et bon disons que mon genre d'attitude est ce qu'il recherchent. Si le code est pompe sur le net, tu est qualifie de tricheur et resultat : -42. Ils ont d'ailleurs une moulinette de triche tres evoluee, capable de reconnaitre les programmes pompes sur le net ou sur quelqu'un d'autre.
Bon ben merci Bernie, moi j'y retourne!
|
|
| |
Totalement inutile, donc completement indispensable 
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 23 novembre 2004 - 21 h 40 m 32 s |
|
|
De rien, pour ce que je t'ai aidé 
bosse bien, et j'espère que tu vas finir par avoir les félicitations du jury !
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|
iraysyvalo
-
Messages : 9 647 Inscrit le 19/11/02
Ville : Lyon
Non connecté
|
|
Posté le 23 novembre 2004 - 23 h 17 m 16 s |
|
|
Puisqu'on est en plsin Unixerie, t'es oblige d'utilise des signaux ??
Pour la variable globale, ce serait dans le client ?
|
|
| |
Message édité 1 fois, la dernière par iraysyvalo le 23 novembre 2004 - 23 h 18. |
| |
Pour un ban rapide et garanti sur ce forum, argumentez vos posts, dites simplement la verite, parlez de la realite et les leche-culs d'un cote et les maniaques du ban de l'autre se feront un plaisir de vous envoyer au purgatoire aussi sec.
|
Woofy
Pour les bons tuyaux me demander
Messages : 26 244 Inscrit le 11/01/02
Ville : Paris / Grenoble
Non connecté
|
|
Posté le 24 novembre 2004 - 00 h 16 m 27 s |
|
|
bah je sais pas, j'utilise la structure avec un char (chaine a transmettre convertie en binaire) et un int (pid serveur) dans le client et un int pour le pid client dans le serveur.
Non je suis pas obligé d'utiliser les signaux, mais je peut pas faire autrement!
|
|
| |
Totalement inutile, donc completement indispensable 
|
Petit_PimoOosE
rsqrtps & pshufb
Messages : 4 617 Inscrit le 15/06/03
Ville : Montréal
Non connecté
|
|
Posté le 24 novembre 2004 - 03 h 45 m 43 s |
|
|
tu n'as pas droit aux tubes ? ni même à stdio.h ?
|
|
| |
Huile de fraise.
|
bernie38
Waldorf (le pote à Statler)
Messages : 11 420 Inscrit le 28/08/03
Ville : Claix
Non connecté
|
|
Posté le 24 novembre 2004 - 07 h 46 m 19 s |
|
|
Le 24 novembre 2004 - 03 h 45, Petit_PimoOosE a écrit :
tu n'as pas droit aux tubes ? ni même à stdio.h ?
|
ben oui, les tubes, que j'ai appelé pipe, ça pourrait le faire...
Sinon, woofy, je comprends pas trop bien quand tu dis que tu transformes la chaine en binaire : ça veut dire quoi exactement ? (:rougir: j'ai pas trop regardé ton code, désolé) pour moi, binaire, hexa ou autre, c'est jamais qu'une représentation "humaine"...
|
|
| |
La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire
|