如何在不包含“unistd.h”的情况下使用read()和write()?

时间:2015-02-16 20:38:16

标签: c file-io header-files system-calls unistd.h

我在程序中使用了syscalls read()和write(),并在程序中包含“unistd.h”头文件。但是程序仍然有效,并给出了预期的结果。

运行程序后,我想我会读取read()和write()的手册页。

在read()和write()的man 2页面中,在SYNOPSIS部分中提到我需要包含unistd.h头文件以使用read()或write()。

SYNOPSIS
   #include <unistd.h>

   ssize_t read(int fd, void *buf, size_t count);


SYNOPSIS
   #include <unistd.h>

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

所以我很惊讶我的程序是如何工作的,虽然我没有包含unistd.h?

以下是我的计划。这是一个使用read()和write()系统调用将源文件的内容复制到目标文件的程序。

#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>

int main()
{
    /* Declaring the buffer. */
    /* Data read by read() will be stored in this buffer. */
    /* Later when write() is used, write() will take the contents of this buffer and write to the file.*/

    char buffer[512];

    /* Decalring strings to store the source file and target file names. */

    char source[128], target[128];

    /* Declaring integer variables in which integer returned by open() will be stored. */
    /* Note that this program will open a source file, and a target file. So, 2 integers will be needed. */

    int inhandle, outhandle;

    /* Declaring integer variable which will specify how much bytes to read or write.*/

    int bytes;

    /* Taking source filename from keyboard.*/

    printf("\nSource File name: ");
    scanf("%s",source);

    /* Open the source file using open().*/

    inhandle = open(source, O_RDONLY);

    /* If there is error while opening source file.*/

    if (inhandle == -1)
    {
            perror("Error opening source file.\n");
            exit(1);
    }

    /* Taking target filename from keyboard.*/

    printf("\nTarget File name: ");
    scanf("%s",target);

    /* Open the target file using open().*/

    outhandle = open(target, O_CREAT | O_WRONLY, 0660);

    /* If there is error while opening target file.*/

    if (outhandle == -1)
    {
            perror("Error opening target file.\n");
            close(inhandle);
            exit(2);
    }

     /* Below code does following:
       1. First reads (at most) 512 bytes from source file
       2. Then copies them to buffer
       3. If bytes read is greater than 0, write the content stored in buffer to target file.
    */

    while((bytes = read(inhandle, buffer, 512)) > 0)
    {
                    write(outhandle, buffer, bytes);
    }

    /* Close both source and target files. */
    close(inhandle);
    close(outhandle);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

你的程序因为隐式函数声明而工作,read()write()都返回ssize_t和编译器在隐式声明函数时假定int,因此它可能会起作用你知道吗。

如果您在启用警告的情况下编译程序,那么编译器会使用gcc警告您

gcc -Wall -Wextra -Werror
如果

找到隐式声明的函数,即没有原型的函数,

将停止编译。