2016-12-05 1 views
0

Je veux écrire un programme qui utilise exec pour muter un enfant et l'utiliser pour faire une action en rideau. L'enfant doit calculer une équation simple (-, +, *, /). Lorsque je tente d'accéder au fichier à l'aide execvp je reçois l'erreur suivante:execvp renvoie l'erreur refusée perimission dans c

execvp() failed!: Permission denied

Toute personne a une idée de ce que je fait de mal? Voici mon code ci-dessous.

int main() 
{ 
    signal(SIGCHLD, SIG_IGN); //ignore child signal from now on 
    pid_t status; 
    char *a[2] = { "calculator", "2+1", NULL }; 

    status = fork(); 
    if (status != 0) 
    { 
     do_child(0, a); 
    } 


    return EXIT_SUCCESS; 
} 

/* 
* id 0: calculator 
* id 1: factorial 
* id 2: pid 
*/ 

void do_child(int id, const char *args[]) 
{ 
    switch (id) { 
    case 0: 
     if (execvp("../ex2cFactorial/ex2cCalculator.c", args) != 0) 
     { 
      perror("execvp() failed!"); 
      exit(EXIT_FAILURE); 
     } 
     break; 
     //other cases (haven't been written yet) 
    } 
} 
+1

Compile-t-il sans avertissements? 'char * a [2] = {" calculatrice "," 2 + 1 ", NULL};' Mettre 3 pointeurs dans un tableau contenant 2 éléments est une astuce que les compilateurs n'aiment pas. Etes-vous sûr que votre fichier 'ex2cCalculator.c' est un exécutable? – Gerhardh

+1

'ex2cCalculator.c' ressemble à un fichier de code source qui n'a probablement pas le bit exec défini. Vous voulez probablement dire 'ex2cCalculator' ou quel que soit le nom que vous utilisez pour l'exécutable compilé et lié. –

+0

cette instruction: 'char * a [2] = {" calculatrice "," 2 + 1 ", NULL};' est en réalité trois paramètres, pas 2. Suggérer: 'char * a [] = {" calculatrice "," 2 + 1 ", NULL};' de manière à laisser le compilateur comprendre que le tableau 'a []' doit avoir 3 pointeurs. – user3629249

Répondre

2

ex2cCalculator.c est probablement un fichier source, ce dont vous avez besoin, il y a le nom de l'exécutable (ex2cCalculator, a.out tout)

Il y a aussi des éléments en excès dans l'initialiseur de tableau. Il devrait être char *a[3] = { "calculator", "2+1", NULL };