实现系统调用而不显式调用它们

时间:2014-08-08 05:56:57

标签: c linux unix

如何在c编程语言中实现类似fork()exec()的UNIX系统调用,而无需进行显式调用。那不是在程序代码中使用fork()exec()之类的系统调用吗? 我们都知道通过显式调用实现系统调用。

#include <stdio.h>
#include <sys/wait.h>

int main()
{
   int p1,p2;

   p1 = fork();

   if(p1 == -1)
   {
       printf(“Error”);
       return 0;
   }
   else
   {
       printf(“parent is %d\n”, getppid());
       printf(“child is %d\n”, getpid());
   }

   p2 = fork();
   printf(“parent is %d\n”, getppid());
   printf(“child is %d\n”, getpid());
}

我只想要一个与上面功能相同但不调用fork()系统调用的程序。

2 个答案:

答案 0 :(得分:4)

首先,fork()exec()不是系统调用,它们是库调用到C运行时库中。他们可能最终进入系统调用(在Linux上,fork()exec()很可能会使用sys_forksys_execve系统调用结束,有关详细信息,请参阅此List of system calls

系统调用是内核的接口,并且是高度依赖于体系结构的(不同的参数传递,实际进行系统调用的不同机制等)。 C库可以封装这些差异,以便编写可移植的应用程序。

如果您(例如出于学习目的)仍想直接调用系统调用,则有两种可能:

  1. 使用内联汇编,例如类似于以下内容,可以在sys_exit架构上调用i386系统调用:

    __asm__ ("movl $1, %eax\n\t"         /* System-call "sys_exit" */
             "movl $0, %ebx\n\t"         /* Exit-code 0 */
             "int  0x80");
    

    从以下示例中可以看出,在x86_64架构上以完全不同的方式调用相同的系统调用:

    __asm__ ("mov $60, %rax\n\t"         /* System-call "sys_exit" */
             "mov $0, %rdi\n\t"          /* Exit-code 0 */
             "syscall");
    
  2. 使用syscall()功能。有关详细信息,请参阅Accessing a system call directly from user program

答案 1 :(得分:0)

如果没有用C或任何其他语言显式调用系统调用,则无法调用系统调用。你必须明确地打电话给他们。