Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/08/2007, à 14:58

JiC

Probleme Programmation C - Appel System signal.h

Bonjour, j'ai un probleme de programation. J'ai ecrit un petit programme (pour un cours) mais j'ai un probleme avec la structure sigaction et signal.h le compilateur me raconte des droles de truc...


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>

#define SYS(call) ((call)==-1 ? perror(#call),exit(1):0)

void handler();

int main(int argc,char*argv[]){
	
	int pid,fdPipe[2],fdstdin,fdstdout;
	SYS(pipe(fdPipe));
	SYS((pid=fork()));
	if(pid==0){ /*fils*/
		SYS(close(0));
		SYS(close(fdPipe[1]));
		SYS(dup(fdPipe[0]));
		
		SYS(execl("/fiche6/reverse","reverse",(char*)NULL));
		SYS(close(fdPipe[0]));
	}
	else{/*pere*/
		char ligne[256];
		struct sigaction sig;
		sigset_t set,oldset,empty;

		sig.sa_handler= handler;
		sigemptyset(&sig.sa_mask);
		sig.sa_flags=SA_NOMASK;
		sigaction(SIGUSR1,&sig,NULL);

		sigemptyset(&empty);
		sigemptyset(&set);
		sigaddset(&set, SIGUSR1);
		sigprocmask(SIG_BLOCK,&set, &oldset);

		SYS(close(fdPipe[0]));
		while(fgets(ligne,255,stdin)!=NULL){
			printf("%s",ligne);
			fprintf((FILE*)fdPipe[1],"%s",ligne);
			sigsuspend(&empty);
		}
		
	}
	
}
void handler(){
	printf("pere bloque");
}

message de compilation :

gcc -ansi -o unix6 unix6.c
unix6.c: In function «main":
unix6.c:29: erreur: storage size of «sig" isn"t known
unix6.c:30: erreur: «sigset_t" undeclared (first use in this function)
unix6.c:30: erreur: (Each undeclared identifier is reported only once
unix6.c:30: erreur: for each function it appears in.)
unix6.c:30: erreur: expected «;" before «set"
unix6.c:34: erreur: «SA_NOMASK" undeclared (first use in this function)
unix6.c:37: erreur: «empty" undeclared (first use in this function)
unix6.c:38: erreur: «set" undeclared (first use in this function)
unix6.c:40: erreur: «SIG_BLOCK" undeclared (first use in this function)
unix6.c:40: erreur: «oldset" undeclared (first use in this function)

Je ne vois pas ce que j'ai fait de mal...
Merci de votre aide.

#2 Le 14/08/2007, à 15:39

gene69

Re : Probleme Programmation C - Appel System signal.h

oui c'est assez bizarre. signal.h ne doit pas définir tout seul la structure sigaction. Vu le man on peut penser qu'il devrait le faire... pour l'instant déclare toi même les structures dans un fichier séparé.  (je ne t'apprend rien).

après faudrait fouiller de ce côté là...
http://www.google.com/codesearch?hl=fr&q=+lang:%22c%22+sigaction


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#3 Le 14/08/2007, à 15:44

gene69

Re : Probleme Programmation C - Appel System signal.h

pour la premiere structure, apparemment quelque chose bloque l'inclusion par <signal.h>

tu peux le faire toi même.

#include <bits/sigaction.h>

pour les autres... googlecode est d'un grand secours.

Sinon, sur un forum de développeur tu aurais pu trouver quelqu'un qui t'explique mieux ce cas et qui te dise si par hasard cette méthode est dépréciée....


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne

#4 Le 14/08/2007, à 19:11

nicolas.sitbon

Re : Probleme Programmation C - Appel System signal.h

Bonjour c'est l'erreur classique : tu indiques au compilateur de passer en mode ansi strict donc tout ce qui est posix ne passe pas. Compile comme ceci : gcc -std=gnu89 -Wall -pedantic -g -o unix6 unix6.c
(tu peux même compiler en c99 avec -std=gnu99)
autrement il y avait quelques petites erreurs que je me suis permis de corriger :

#include <stdio.h>
#ifndef _POSIX_C_SOURCE 
# define _POSIX_C_SOURCE 199506L
#endif
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

#define SYS(call) ((call)==-1 ? perror(#call),exit(1):0)

void handler(int);

int main(int argc,char*argv[]){
    
    int pid,fdPipe[2];
    SYS(pipe(fdPipe));
    SYS((pid=fork()));
    if(pid==0){ /*fils*/
        SYS(close(0));
        SYS(close(fdPipe[1]));
        SYS(dup(fdPipe[0]));
        
        SYS(execl("/fiche6/reverse","reverse",(char*)NULL));
        SYS(close(fdPipe[0]));
    }
    else{/*pere*/
        char ligne[256];
        struct sigaction sig;
        sigset_t set,oldset,empty;

        sig.sa_handler= handler;
        sigemptyset(&sig.sa_mask);
        sig.sa_flags=SA_NOMASK;
        sigaction(SIGUSR1,&sig,NULL);

        sigemptyset(&empty);
        sigemptyset(&set);
        sigaddset(&set, SIGUSR1);
        sigprocmask(SIG_BLOCK,&set, &oldset);

        SYS(close(fdPipe[0]));
        while(fgets(ligne,255,stdin)!=NULL){
            printf("%s",ligne);
            fprintf((FILE*)fdPipe[1],"%s",ligne);
            sigsuspend(&empty);
        }
        
    }
    return EXIT_SUCCESS;
    
}
void handler(int dummy){
    printf("pere bloque");
    fflush(stdout);
}

Cordialement

#5 Le 15/08/2007, à 12:06

jeannot171

Re : Probleme Programmation C - Appel System signal.h

Oki, merci beaucoup, ca fonctionne mieu comme ca smile

Hors ligne

#6 Le 15/08/2007, à 13:02

nicolas.sitbon

Re : Probleme Programmation C - Appel System signal.h

De rien, n'oublie pas de mettre le sujet en résolu.
Cordialement.