C 开放式';当文件当前在正在运行的进程中打开时,返回错误

C 开放式';当文件当前在正在运行的进程中打开时,返回错误,c,file,error-handling,io,C,File,Error Handling,Io,这是我的密码。我完全知道,直接执行时会产生一个无休止的循环。我所做的是编译这段代码,然后在linux命令行中通过/a.out&执行两次。程序第一次执行时,运行良好,提供了一个良好的文件句柄。当程序的第一个实例在后台运行时,我在一分钟后执行第二个实例(通过/a.out&),返回的文件句柄是完全相同的。我希望第二个实例的返回值为负值,以指示第一个实例正在使用该文件 我如何解决这个问题?我不想使用像fopen/fread这样的缓冲文件函数,因为我要生成的文件很小,必须在程序开始时生成,然后才能在代码中

这是我的密码。我完全知道,直接执行时会产生一个无休止的循环。我所做的是编译这段代码,然后在linux命令行中通过
/a.out&
执行两次。程序第一次执行时,运行良好,提供了一个良好的文件句柄。当程序的第一个实例在后台运行时,我在一分钟后执行第二个实例(通过
/a.out&
),返回的文件句柄是完全相同的。我希望第二个实例的返回值为负值,以指示第一个实例正在使用该文件

我如何解决这个问题?我不想使用像fopen/fread这样的缓冲文件函数,因为我要生成的文件很小,必须在程序开始时生成,然后才能在代码中发生任何其他事情

这是我的代码:

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

int main(){
        char* pidf="/testpid.del";
        int lfp=open(pidf,O_WRONLY|O_CREAT|0x700);
        printf("File handle = %d\n",lfp);
        if (lfp ==-1){printf("Can't use PID file: %s\n",pidf);return -1;}
        while(1){
              sleep(1);
        }
        close(lfp);
}
#包括
#包括
#包括
#包括
#包括
int main(){
char*pidf=“/testpid.del”;
int lfp=打开(pidf,O|U WRONLY | O|U CREAT | 0x700);
printf(“文件句柄=%d\n”,lfp);
if(lfp==-1){printf(“无法使用PID文件:%s\n”,pidf);返回-1;}
而(1){
睡眠(1);
}
关闭(lfp);
}

允许多个进程打开同一个文件。如果您需要互斥,请使用文件锁。也许您需要使用
O_exc
。如果文件已存在而不是通过此调用创建,则这将导致错误。只需确保在流程完成时删除该文件,以便下一个实例可以创建它。此外,如果
0x700
是创建文件的权限,则至少有两种方式是错误的:#1。它应该是一个单独的参数,而不是在
O.*
标志中进行OR运算#2.
rwx------
是八进制
0700
而不是十六进制
0x700
。好吧,巴尔马的想法行得通。原来我使用了文件锁定和非阻塞参数。