2011-12-14 24 views
1

私はcreatとopenシステムコールの両方を試みました。どちらも同じように動作し、私はそれらの違いを予測することはできません。私はマニュアルページを読んだ。 「オープンでデバイス特殊ファイルを開くことはできますが、creatでは作成できません」というメッセージが表示されます。私は特別なファイルが何であるか理解していません。ここでcで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」という内容を出力しませんでした。ファイルが正常に作成されました。しかし内容は空です

答えて

10

creat機能は、ファイルを作成しますが、既存のファイルを開くことはできません。既存のファイルにcreatを使用している場合、ファイルは切り捨てられ、書き込むことしかできません。 Linux manual pageから引用する:

レコード生成()O_CREATに等しいフラグを()を開くことと等価である| O_WRONLY | O_TRUNC。

デバイス特殊ファイルは、/devフォルダ内のすべてのファイルです。これは、単に普通のread/write/ioctlコールによってデバイスと通信する方法です。

+0

おかげヨアヒムPileborg :) – Dinesh

0

UNIXシステムの初期のバージョンでは、openの2番目の引数は0,1,2のみでした。まだ存在していないファイルを開く方法はありませんでした。したがって、新しいファイルを作成するには、別のシステムコールcreatが必要でした。

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

は同等です:

注こと

open(pathname, O_WRONLY|O_CREAT|O_TRUNC, mode); 
関連する問題