使用嵌入式汇编实现系统调用
/* 使用嵌入式汇编代码实现fork及getpid系统调用 */
1 #include <stdio.h> 2 3 int main() { 4 int my_pid = 0; 5 int fork_id = 0; 6 7 do { 8 __asm__ __volatile__ ( 9 "mov $0x02, %%eax\n\t" 10 "int $0x80\n\t" 11 : "=a"(fork_id) 12 ); 13 } while(my_pid < 0); 14 __asm__ __volatile__ ( 15 "mov $20, %%eax\n\t" 16 "int $0x80\n\t" 17 : "=a"(my_pid) 18 ); 19 if(fork_id == 0) { 20 printf("child pid : %d\n", my_pid); 21 } else { 22 printf("parent pid : %d\n", my_pid); 23 } 24 }
# 执行结果如下
1 [local@localhost ~]$ ./a.out 2 child pid : 24168 3 parent pid : 24167 4 [local@localhost ~]$ ./a.out 5 parent pid : 24169 6 child pid : 24170
说明:
使用嵌入式汇编实现系统调用的核心在于: 1. 将系统调用的功能号写入%eax寄存器; 2. 调用系统中断'init 0x80'。 如果系统调用带有参数,需在调用系统中断之前, 将参数依次放入%ebx, %ecx, %edx, %esi, %edi中即可。