sined40 | Bonsoir,
Je souhaite écrire un programme permettant à un serveur et plusieurs clients de communiquer via des fifos.
Depuis le programme serveur, je souhaite appeler plusieurs fois un programme via l'appel système execv et un appel à fork afin de créer un process serveur et plusieurs process clients.
Après exécution de mon programme et l’exécution dans ma console Ubuntu de la commande "ps", cela ne semble pas marcher comme prévu.
Mes fifos ne sont pas crées correctement coté client Mon programme n'est qu'une ébauche, je souhaite juste valider que la création des fifos coté client se passe bien.
Code MyClient.c
Code :
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #define CLIENT_PIPE "NamedPipeClient"
- int main(int argc,char* argv[])
- {
- char buf[128];
-
- sprintf(buf,"%s%d", CLIENT_PIPE, atoi(argv[1]));
-
- /* Creation of the fifo */
- umask(0);
- if((mknod(buf, S_IFIFO | 0666, 0)) !=0)
- {
- printf("Error on the client fifo creation (%s).\n", CLIENT_PIPE);
- return EXIT_FAILURE;
- }
-
- printf("Client %d\n", atoi(argv[1]));
-
- /* Infinite loop */
- while(1)
- {
- ;
- }
-
- return EXIT_SUCCESS;
- }
|
Code MyServer.c
Code :
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #define NBR_MAX_CLIENT 5
- #define SERVER_PIPE "NamedPipeServ"
- int main(int argc,char* argv[])
- {
- int ClientId;
- pid_t PoolCltPid[NBR_MAX_CLIENT];
- pid_t ParentId;
- char* ExecArgs[]={"./MyClient.exe", "MyClient.exe", 0, "NULL"};
-
- /* Init */
- ClientId = 0;
- memset((void*) PoolCltPid, '\0', sizeof(PoolCltPid));
-
- /* Creation of the fifo */
- umask(0);
- if((mknod(SERVER_PIPE, S_IFIFO | 0666, 0)) !=0)
- {
- printf("Error on the server fifo creation (%s).\n", SERVER_PIPE);
- return EXIT_FAILURE;
- }
-
- /* Get the parent PID */
- ParentId = getpid();
-
- /* Create nbr max of client */
- for(ClientId = 0; ClientId < NBR_MAX_CLIENT; ClientId++)
- {
- /* Create a child process */
- if (getpid() == ParentId)
- {
- PoolCltPid[ClientId] = fork();
-
- /* Child process pid equal 0 */
- if (PoolCltPid[ClientId] == 0)
- {
- printf(" |_Client Id: %d\n", ClientId);
- sprintf(ExecArgs[2], "%d", ClientId);
- execv((char*) ExecArgs[0],(char* const*) ExecArgs);
- }
- }
- }
-
- /* Infinite loop */
- while(1)
- {
- ;
- }
-
- return EXIT_SUCCESS;
- }
|
|