c - 如何将 STDIO.H 库函数与严格的系统调用交换?

标签 c linux

一个简单的程序,它接受终端指定的输入文件,并更改要反转的文本。怎么可以<stdio.h>函数只能转换为linux系统调用吗? (我假设仅使用像 <unistd.h> 这样的库)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* concat(const char *str1, const char *str2)
{
    char *answer = malloc(strlen(str1) + strlen(str2) + 1);
    strcpy(answer, str1);
    strcat(answer, str2);
    return answer;
}

int main(int argc, char** argv) {

    FILE * fp;
    char * line = NULL;
    size_t len = 0;

    fp = fopen(argv[1], "r");
    if (fp == NULL){
        perror("\nError ");
        exit(1);
    }

    char *rev1 = "rev ";
    char *rev2 = {argv[1]};
    char *rev3 = concat(rev1,rev2);

    system(rev3);

    fclose(fp);

    return 0;
}

感谢您的帮助。公司出于某种原因只希望我使用系统调用,这次实习不太顺利!

最佳答案

don't understand how to properly implement [read and write]

假设您的意思是调用它们(而不是实现它们),则 readwrite 的问题是它们的读取或写入可能少于请求的数量,因此您必须调用他们在一个循环中。

size_t to_write = strlen(str);
while (to_write) {
   ssize_t written = write(fd, str, to_write);
   if (written < 0) {
      perror(NULL);
      exit(1);
   }

   str      += written;
   to_write -= written;
}

如果您知道需要读取多少内容或尝试读取整个文件,则读取工作方式相同。 (要读取整个文件,请读取 block ,直到 read 返回 08*1024 的因子是不错的 block 大小。)

否则,事情会变得更加复杂。在阅读之前你怎么知道要读多少?例如,如果您想读取一行,则在遇到终止换行之前,您不知道该行有多长。您可以一次读取一个字符,但这非常低效。你可以像 stdio 那样做,并使用一个缓冲区来保存多余的内容。此时您不妨使用 stdio。

关于c - 如何将 STDIO.H 库函数与严格的系统调用交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58682025/

相关文章:

c - 评估字符串和数组 - C

c - GHC 运行时如何处理文件 I/O?

linux - AWS RHEL7 丢失的包

linux - 修改树莓派的Debian镜像

linux - 如何通过命令行在 VPS 上安装 Firefox?

linux - Flume 在 Linux 中运行失败

c - 使用 mmap 映射的内存,并与 mprotect 一起使用

c - 是否可以在 C 中返回不同的 "false"?

c - 返回值和垃圾值的关系

linux - 使用 Linux 命令从 CSV 文件中提取指定的列?