J'ai implémenté la macro syscall pour appeler les appels d'interruption logiciels. Cela fonctionnait bien pour beaucoup de syscalls. Cependant, ce n'était pas pour fork()
. Le pid de retour est le même pour le processus parent et enfant. L'extrait est comme ci-dessous:fork() implémentation à l'aide de l'appel svc
#define SYSCALL0(N) ({ \
register int ip asm("ip") = N; \
register int r0 asm("r0"); \
asm volatile("swi 0x80" : "=r"(r0) : "r"(ip) : "memory"); \
r0; \
})
int main(int argc, char * argv[]) {
NSLog(@"--beginning of program\n");
int counter = 0;
pid_t pid = SYSCALL0(2);
if (pid == 0) {
NSLog(@"pid = %d", getpid());
// child process
for (int i = 0; i < 3; ++i)
NSLog(@"child process: counter=%d\n", ++counter);
}
else if (pid > 0) {
NSLog(@"pid = %d", getpid());
// parent process
for (int i = 0; i < 3; ++i)
NSLog(@"parent process: counter=%d\n", ++counter);
}
else {
// fork failed
NSLog(@"fork() failed!\n");
return 1;
}
NSLog(@"--end of program--\n");
}
Sortie:
2015-10-11 21:29:43.666 Training[2564:907] --beginning of program
2015-10-11 21:29:43.669 Training[2564:907] pid = 2650
2015-10-11 21:29:43.670 Training[2564:907] parent process: counter=1
2015-10-11 21:29:43.670 Training[2564:907] parent process: counter=2
2015-10-11 21:29:43.669 Training[2564:907] pid = 2650
2015-10-11 21:29:43.671 Training[2564:907] parent process: counter=3
2015-10-11 21:29:43.671 Training[2564:907] --end of program--
2015-10-11 21:29:43.671 Training[2564:907] parent process: counter=1
2015-10-11 21:29:43.672 Training[2564:907] parent process: counter=2
2015-10-11 21:29:43.673 Training[2564:907] parent process: counter=3
2015-10-11 21:29:43.674 Training[2564:907] --end of program--
L'environnement testé est une prison iOS cassé (il ne fonctionnera pas sur la non-jailbreaké) en cours d'exécution sur ARMv7. Je pense que je n'ai peut-être pas fait assez avec le retour de l'appel swi, donc il ne pouvait pas retourner 0 pour indiquer le processus de l'enfant. Qu'est-ce que j'ai raté? Comment puis-je le faire fonctionner correctement?
Quelle est votre question? – Lorenzo
Désolé si ce n'est pas clair, je modifiais la question. La question est "Comment puis-je le faire fonctionner correctement" – Krypton