2016-11-14 3 views
0

Mais le problème est le PID que j'imprime avant d'envoyer à travers la méthode et le PID que j'imprime après l'avoir reçu dans la méthode sont totalement différents. Je ne peux pas comprendre cela .Je crée un processus d'élimination en utilisant le PID

void killbyPIDprocess(struct process** ptr,char* p) 
{ 
    int i=0; 
    printf("hi"); 

while(ptr[i]!=NULL) 
{ 
    printf("Inside while loop"); 
    printf("%d\n",ptr[i]->pid); 
    printf("%d\n",*p); 
    if(strcmp(ptr[i]->pid,p)==0) 
    { 
     printf("Kill process of PID %d\n",p); 

    } 
    else 
    { 
     i++; 
    } 

} 
} 

Dans la méthode de la boucle, ma condition est

void loop(char *input) 
{ 
bool flag=true; 
char **tokens; 
    struct process **ptr=(struct process*) malloc (BUFFERSIZE);//Is the array that contains pointers to all the processes created. 
int ci=0;int i=0; 

while(flag==true) 
{ 
    input=getInp(input); 
    tokens=tokenize(input); 
    if(strcasecmp(*tokens,"kill")==0) 
    { 
     strtok(tokens[1],"\n"); 
     char* pid=(char*)malloc (BUFFERSIZE); 
     pid=tokens[1]; 
     printf("%s",pid); 
     killbyPIDprocess(ptr, pid); 

    } 
    } 

La méthode d'entrée prend juste entrée de l'utilisateur. La méthode tokenize utilise la méthode strtok pour marquer l'entrée. Si je saisis kill (PID), il va à la méthode killbyPIDprocess (ptr, pid) où ptr est le double pointeur contenant tous les pointeurs des processus de struct. Je stocke les informations sur les processus lorsque j'en crée un. Le pid que j'imprime dans la méthode loop est le même que celui de l'entrée que je lui donne, c'est-à-dire le pid que je veux tuer, mais quand je passe ce pid à travers la méthode killbyPIDprocess, il montre une autre valeur. Je n'ai pas encore commencé à travailler sur le code de mise à mort, car il continuait à me donner des erreurs. J'ai utilisé des instructions d'impression pour garder une trace de la quantité de mon code fonctionnait. Je suis relativement nouveau à C et autodidacte donc s'il vous plaît signaler les erreurs.

+0

Et cela n'a pas d'importance si j'utilise * p ou p dans le killbyPIDprocess(). p montre la valeur de la poubelle – Sobiaa

Répondre

1

printf("%d\n",*p); va imprimer un code numérique pour le premier caractère dans un tampon, donc vous devez utiliser le spécificateur de format %s - printf("%s\n", p); pour obtenir les mêmes résultats.

Ce code if(strcmp(ptr[i]->pid,p)==0) est également incorrect. process::pid Le membre a un type pid_t, qui est un entier signé. L'utiliser dans les routines de comparaison de chaînes est un comportement indéfini (pas sûr qu'il sera même compilé). Pour comparer les PID, vous devez convertir vos données de chaîne en nombre entier, en utilisant par exemple une fonction atoi. Ensuite, vous pouvez les comparer directement avec l'opérateur ==.

+0

Merci. Alors, comment comparer un pid_t avec une chaîne? – Sobiaa

+0

@KeineLust Vous avez raison, bien sûr. Mis à jour une réponse – Ari0nhh

+0

Thak vous tant. travaux d'atoi: D – Sobiaa