почему O_RDWR не дает мне права на запись и чтение в этом коде? - PullRequest
0 голосов
/ 28 апреля 2019

Я начинаю интересоваться file descriptors в C, я написал следующий код:

int main (void) 
{ 
    int fd1, fd2, sz;
    char *buf = "hello world !!!";
    char *buf2 = malloc(strlen(buf));

    fd1 = open ("test.txt", (O_RDWR | O_CREAT));
    printf("file fd1 created\n");
    write(fd1, buf, strlen(buf));
    printf("write %s, in filedescpror %d\n", buf, fd1);
    sz = read(fd1, buf2, strlen(buf)); 
    printf("read %s, with %d bytes from file descriptor %d\n", buf2, sz, fd1); 
    close(fd1);
    fd2 = open ("testcpy.txt", (O_RDWR | O_CREAT));
    write(fd2, buf2, strlen(buf));
    close(fd2);
    return 0; 
}

Обычно:

  • два файла с чтением ипредоставляются разрешения на запись,
  • buf вставляется в fd1
  • fd1 и считывается, а данные сохраняются в bf2
  • bf2разбирается на fd2

Первая проблема заключается в том, что разрешение, которое я получаю в результате, неверно, происходит то, что что-то вне buf2 разбирается на fd2.

Может кто-нибудь сказать мне, что происходит, мой код неверен, или то, что происходит, является ожидаемым поведением.

1 Ответ

0 голосов
/ 28 апреля 2019

Вам необходимо перемотать бафф после write(), а также добавить разрешения (3-й аргумент open()), это базовый пример:

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

int main (void)
{
    int fd1, fd2, sz;
    char *buf = "hello world !!!";
    char *buf2 = malloc(strlen(buf) + 1); // space for '\0'

    fd1 = open ("test.txt", (O_RDWR | O_CREAT), 777); // 3rd arg is the permissions
    printf("file fd1 created\n");
    write(fd1, buf, strlen(buf));
    lseek(fd1, 0, SEEK_SET);            // reposition the file pointer
    printf("write %s, in filedescpror %d\n", buf, fd1);
    sz = read(fd1, buf2, strlen(buf));
    buf[sz] = '\0';
    printf("read %s, with %d bytes from file descriptor %d\n", buf2, sz, fd1);
    close(fd1);
    fd2 = open ("testcpy.txt", (O_RDWR | O_CREAT));
    write(fd2, buf2, strlen(buf));
    close(fd2);
    return 0;
}
...