1

これは私のコードです:

#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define FILE "./test.txt"
char buf[20]="Hello, World!";
int main()
{
    int fd;
    if((fd=open(FILE,O_EXCL|O_CREAT))==-1)
    {
        printf("File Already EXIST!\n");
        if((fd=open(FILE,O_RDWR))==-1)
        {
            perror("open error");
            exit(1);
        }
    }
    else 
    {
        if((fd=open(FILE,O_RDWR|O_CREAT,0666))==-1)
        {
            perror("create error");
            exit(1);
        }
    }
    if(write(fd,buf,sizeof(buf))==-1)
    {
        perror("write error");
        exit(1);
    }
    else printf("Write Done.\n");
    return 0;
}

プログラムを実行すると、奇妙なことが起こります。テキスト ファイルのモードは、実行するたびに異なります (作成機能をテストするために、プログラムの実行後にテキスト ファイルを rm します)。それで、なぜこれが起こるのですか?

4

1 に答える 1

2

すべての警告とデバッグ情報を使用してコンパイルする必要があります ( gcc -Wall -g)。

 #define FILE "./test.txt"

FILEは不適切です ( fromと競合し<stdio.h>ます)。

 #define FILE_NAME "./test.txt"

それから

 if((fd=open(FILE,O_EXCL|O_CREAT))==-1)

間違っている。open(2)には 3 番目のモード引数が必要です (O_CREAT少なくとも渡す場合)。

カーネルは、ファイルを作成するときにモードを必要openとしますO_CREAT。既存のファイルを開く場合、モードは役に立たないため、不要として文書化されていますが、役に立たないものがカーネルに渡されます。

欠落している 3 番目の引数の代わりに、いくつかのガベージが渡されます (これにより、再現性のない未定義の動作が説明されます)。代わりに試す

 fd = open(FILE_NAME, O_EXCL|O_CREAT, 0640);
 if (fd < 0)

ところで、プログラムでstrace(1)を使用して、実行中のシステムコールを理解することもできます。

于 2013-10-09T05:09:06.573 に答える