如何使用lockf()解锁?

6

我希望能够从txt文件中读取并追加下一个数字,同时使用fork作为第二个进程。在以下代码中,我需要帮助解锁文件。我无法解锁该文件。

int main() {
  int x;
  pid_t child = fork();
  FILE *file;
  //flock(fileno(file),LOCK_EX);
  file = fopen ("list.txt", "r");
  //printf("file is locked");
  int fdSource = (int)file;
  if (fdSource > 0){
    if (lockf(fdSource, F_LOCK, 0) == -1)
       x = readValue(file);
       return 0; /* FAILURE */
    }
    else {
      return 1;
    }
    if (lockf(fdSource, F_ULOCK, 0) == -1){
       printf("file is not lock");
       appendValue(x);
    }
    else {
       return 1;
    }
    appendValue(x);
}

3
int fdSource = (int)file; 这行代码是错误的。请查看 fileno(3) 函数的 man 手册。 - Mat
谢谢,但如果不在之前使用(int),我会遇到错误并建议将其转换。 - user1542921
1
在C语言中,强制类型转换以消除警告是99.999999%的情况下都是一个大错误。使用我上面提到的函数从FILE*获取文件描述符。 - Mat
欢迎来到 SO。请在编辑问题时多加努力,标题中已经有错别字了。此外,正确标记问题非常重要,只是C语言不足以满足这里的要求。lockf 是你的操作系统的一部分,而不是你的编程语言。 - Jens Gustedt
1
你的代码使用了 lockf();你最初标题说的是 flock()。你可以使用其中任何一个,或者使用 fcntl() —— 这是如此多的选择 —— 来进行锁定,但你应该保持一致性。 - Jonathan Leffler
1
请注意,锁定通常是建议性的,而不是强制性的。也就是说,除非子进程检查文件是否被锁定,否则父进程持有文件锁不会阻碍子进程。此外,请注意,系统调用使用文件描述符,而不是文件流(文件指针)。如果必须打开文件流,则使用 fileno(fp) 获取文件流的文件描述符。文件描述符通常用 fd 表示,文件流通常用 fp 表示。 - Jonathan Leffler
1个回答

4

int fdSource = (int)file;替换为以下内容:

int fd = fileno(file);

此外,如果您使用的是UNIX系统,则应该使用flock而不是lockf。要进行锁定,请执行以下操作:
flock(fd, LOCK_EX);

解锁方法:

flock(fd, LOCK_UN);

lockf()也是Unix上有效的锁定函数,fcntl()也是如此。我同意标题问到了flock(),但代码使用了lockf(),所以我将问题的标题与代码匹配(比使代码与标题匹配更简单)。 - Jonathan Leffler
我需要从一个进程读取并由另一个进程附加。但是在我的代码中,fork创建了两个进程,它们分别读取两次并附加到文件两次,例如,它将1 2 3添加到文件中,然后第二个进程将4 5 6添加到txt文件中。 - user1542921
使用 if(child == 0){ codes.. },我只能添加一次。 - user1542921

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接