当lib函数与系统调用具有相同名称时如何使用?

时间:2016-01-14 09:17:21

标签: linux c

代码如下,sched_yield()具有同名的lib函数和系统调用,我不知道sched_yield()中的代码是lib函数还是系统调用,如何区分?

#include sched.h

void shm_lock(volatile uint32_t *lock, uint32_t value, uint32_t spin)
{
    uint32_t  i, n, pid;

    for ( ;; ) {
        if (*lock == 0 && cmp_set(lock, 0, value)) {
            return;
        }

        for (n = 1; n < spin; n <<= 1) {
            for (i = 0; i < n; i++) {
                //printf("i %d\n",i);
                asm_cpu_pause();
            }
            //printf("n %d\n",n);
            if (*lock == 0 && cmp_set(lock, 0, value)) {
                return;
            }
        }

        sched_yield(); // here!!!

        pid = *lock;
        if(pid){
            if(kill(pid,0)==-1 && errno == ESRCH){   
                cmp_set(lock, pid, 0);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

如果它与系统调用具有相同的名称,那么它通常是您的标准库的系统调用包装。

musl libc标准库将sched_yield()定义为:

#include <sched.h>
#include "syscall.h"

int sched_yield()
{
    return syscall(SYS_sched_yield);
}

(最直接的系统调用包装器)。

如果这就是你所要求的,那么C中的函数调用和系统调用包装器之间没有符号区别。

系统调用包装器只是函数(可以是宏)(通常)调用syscall函数,该函数将其参数布局到适当的寄存器并为您的体系结构调用正确的指令(int 80h例如,在x86上发信号通知内核从那里获取它。