2010-05-14 6 views
0

J'ai réussi à appeler l'exit syscall de l'assembly, mais je strugling pour appeler le syscall _getpid et utiliser sa valeur de retour. Voici le code que je utilisegetpid de syscall avec l'application 32 bits et le noyau sur le léopard des neiges

.text 
.globl _getpiddirect 

_getpiddirect: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    movl $39, %eax 
    int $0x80 
    addl $8, %esp 
    popl %ebp 
    ret 

et

#include <stdio.h> 
#include <unistd.h> 

extern unsigned long getpiddirect(); 

int main(int argc, const char *argv[]) 
{ 
    printf("%lu\n", getpiddirect()); 
    printf("%lu\n", (unsigned long) getpid()); 
    return 0; 
} 

getpiddirect revient sans cesse 4056.

Répondre

0

C'est parce que 39 est un code pour getppid - obtenir id processus parent et est Ce que vous obtenez en tant que 4056. Le code getpid est 20, mais s'il vous plaît regardez /usr/include/sys/syscall.h pour la valeur de SYS_getpid comme constante exacte utilisée sur votre système.

Aussi je ne sais pas pourquoi vous voulez 8 octets sur la pile avant d'appeler getpid à travers l'interruption. Cela n'affecte rien et est juste inutile, non?

+0

Merci d'avoir répondu correctement. Je me suis trompé getppid avec getpid. Les 8 octets supplémentaires sont nécessaires pour maintenir la pile alignée comme requis par mac os ABI. –

Questions connexes