如何在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()
系统调用的程序。
答案 0 :(得分:4)
首先,fork()
和exec()
不是系统调用,它们是库调用到C运行时库中。他们可能最终进入系统调用(在Linux上,fork()
和exec()
很可能会使用sys_fork
和sys_execve
系统调用结束,有关详细信息,请参阅此List of system calls。
系统调用是内核的接口,并且是高度依赖于体系结构的(不同的参数传递,实际进行系统调用的不同机制等)。 C库可以封装这些差异,以便编写可移植的应用程序。
如果您(例如出于学习目的)仍想直接调用系统调用,则有两种可能:
使用内联汇编,例如类似于以下内容,可以在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");
使用syscall()
功能。有关详细信息,请参阅Accessing a system call directly from user program。
答案 1 :(得分:0)
如果没有用C或任何其他语言显式调用系统调用,则无法调用系统调用。你必须明确地打电话给他们。