Linux下系统调用与库函数

库函数基于系统调用之上,eg:printf(库函数)和write(系统调用)。经过重定向后,fwrite的内容在文件打印了两次,因为:1.缓冲区方式发生变更(由行缓冲变为全缓冲)2.库函数自带缓冲区,系统调用无缓冲区。

write原型:ssize_t write(int fd, const void *buf, size_t count);

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
        pid_t id;
        printf("hello world");
        const char* msg="I love you";
        write(1,msg,strlen(msg));
        id=fork();
        if(id<0)
        {
                perror("fork");
                exit(1);
        }
        else if(id==0)
        {
                printf("pid: %d,ppid: %d",getpid(),getppid());
        }
        else
        { 
                printf("pid: %d,ppid: %d",getpid(),getppid());
         }
         return 0;
}

将输出结果重定向到file文件

//修改上述代码为:
int main()
{
       pid_t id;
       printf("hello world");
       const char* msg="I love you";
       close(1);
       FILE* fp=fopen("file","w+");
       write(1,msg,strlen(msg));
       id=fork();
       ...
}

关闭文件描述符:标准输出,下一个文件描述符会从前面空的小整数下标开始往后,此时file占据文件描述符1.

时间: 2025-01-02 16:11:18

Linux下系统调用与库函数的相关文章

文件编程之Linux下系统调用

说明: linux下文件编程可使用两种方法: ****linux系统调用 ****C语言库函数 前者依赖于linux系统,后者与操作系统是独立的. 在任何操作系统下,使用C语言库函数操作文件的方法都是相同的. 这里首先记录下Linux下系统调用操作文件编程的学习过程.函数原型: 1.系统调用--创建: int create(const char *filename, mode_t mode); filename为要创建的文件名(包含路径,缺省为当前路径): mode为创建模式. 模式可用数字来表

linux下系统调用、API、系统命令,内核函数的区别与联系

1.系统调用: 应用程序和内核间的桥梁,是应用程序访问内核的入口点;但通常情况下,应用程序通过操作系统提供的API进行编程而不是使用系统调用直接编程; linux的全部系统调用加起来大约只有250个左右. 2.API: API常以c库(libc)的形式提供,c库提供了绝大部分API,每个系统调用在c库中都有对应的封装函数(通常封装函数与系统调用的名称相同).系统调用与c库函数并不是一一对应的,有些c库函数可能使用多个系统调用来实现,也有可能多个c库函数使用同一个系统调用来实现,也有些c库函数不使

Linux 下系统调用的三种方法

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数.下面介绍Linux 下三种发生系统调用的方法: 通过 glibc 提供的库函数 glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时库.glibc 为程序员提供丰富的 API(Application Programming Interfac

关于socket在Linux下系统调用的分析

1.在include/linux/syscalls.h中定义了sys_socket函数的函数原型 asmlinkage long sys_socket(int, int, int); 系统调用函数必须满足: asmlinkage long sys_##function-name(##args){ ,return ret} 2.在arch/arm/include/asm,unistd.h中,将sys_socket系统调用和系统调用好关联起来 #define __NR_socket 97 __SYS

Linux系统调用和库函数调用的区别

Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思.面向的是硬件.而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现.第二,可移植性.第三,底层调用本身的一些性能方面的缺陷.第四:让api也可以有了级别和专门的工作面向. 1.系统调用 系统调用提供的函数如open, close, read,

linux内核系统调用和标准C库函数的关系分析

今天研究了一下系统调用和标准库函数的区别和联系,从网上搜集的资料如下: 1.系统调用是为了方便应用使用操作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数. 2.系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数. 3.read就是系统调用,而fread就是C标准库函数. 4.很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用 5.写程序直接使用的

linux下的系统调用函数到内核函数的追踪

使用的 glibc : glibc-2.17  使用的 linux kernel :linux-3.2.07 系统调用是内核向用户进程提供服务的唯一方法,应用程序调用操作系统提供的功能模块(函数).用户程序通过系统调用从用户态(user mode)切换到核心态(kernel mode ),从而可以访问相应的资源.这样做的好处是:为用户空间提供了一种硬件的抽象接口,使编程更加容易.有利于系统安全.有利于每个进程度运行在虚拟系统中,接口统一有利于移植.             运行模式.地址空间.上

linux下64位汇编的系统调用(5)

看到这里大家都基本知道了如何进行linux下的汇编系统调用:不过有些童鞋可能会问:那些C库中函数里为我们解决的额外汇编代码你是怎么知道的? 好吧,我承认:我是通过逆向知道的,这貌似有点犯规的嫌疑- 比如举个例子,那上一篇里的mmap C库函数来说,首先写一个C代码: #include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <sys/mman.h> #include <sy

归纳整理Linux下C语言常用的库函数----文件操作

在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. 字符串转换 3. 字符测试 4. 文件操作 5. 时间日期 6. 常用数学函数 7. 文件内容操作 8. 文件权限控制 9. 进程操作 10. 线程操作 11. Socket操作 12. 信号处理 13. 数据结构及算法 这次主要总结的是上面黑色部分,关于文件操作的函数. 系统调用归类 * * 函数