В чем разница между открытым и созданным системным вызовом в c? - PullRequest
1 голос
/ 14 декабря 2011

Я пробовал как создать, так и открыть системный вызов.Оба работают одинаково, и я не могу предсказать разницу между ними.Я прочитал справочную страницу.Он показывает «Open может открывать специальные файлы устройства, но creat не может их создавать».Я не понимаю, что такое специальный файл.

Вот мой код,

Я пытаюсь прочитать / записать файл, используя системный вызов creat.

#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
int main()
{
 int fd;
 int written;
 int bytes_read;
 char buf[]="Hello! Everybody";
 char out[10];
 printf("Buffer String : %s\n",buf);
 fd=creat("output",S_IRWXU);
 if( -1 == fd)
 {
  perror("\nError opening output file");
  exit(0);
 }

 written=write(fd,buf,5);
 if( -1 == written)
 {
  perror("\nFile Write Error");
  exit(0);
 }
 close(fd);
 fd=creat("output",S_IRWXU);

 if( -1 == fd)
 {
  perror("\nfile read error\n");
  exit(0);
 }
 bytes_read=read(fd,out,20);
 printf("\n-->%s\n",out);
 return 0;
}

Я экспортировал содержимое «Hello» для печати в файл «output».Файл успешно создан.Но содержание пусто

Ответы [ 2 ]

12 голосов
/ 14 декабря 2011

Функция creat создает файлы, но не может открыть существующий файл.Если использовать creat для существующего файла, файл будет усечен и может быть записан только в.Цитировать со страницы руководства Linux :

creat () эквивалентно open () с флагами, равными O_CREAT | O_WRONLY | O_TRUNC.

Что касается специальных файлов устройства, то это все файлы в папке /dev.Это просто способ связи с устройством с помощью обычных вызовов read / write / ioctl.

1 голос
/ 11 февраля 2017

В ранних версиях системы UNIX вторым аргументом для открытия мог быть только 0, 1 или 2. Не было никакого способа открыть файл, который еще не существовал. Поэтому для создания новых файлов потребовался отдельный системный вызов creat.

Обратите внимание, что:

int creat(const char *pathname, mode_t mode);

эквивалентно:

open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...