c - 如何在C程序和shell脚本之间使用flock

标签 c linux shell flock

我有一个 shell 脚本和一个 C 程序

    #!/bin/bash
    for i in `seq 1 10000`
    do
    (flock -x 200                   // what is 200?
       ./taskA
    ) 200> lockfile
    done

在C程序中,相关代码片段为:

    int fd = open("lockfile", O_WRONLY|O_CREAT); // what permission should I put here?
    for(i=0;i<10000;i++){
      if(fd==-1)
            printf("open file fails\n");

      if(flock(fd, LOCK_EX)==0 ){      // lock the file
            taskB(); // here is what I want to do
            }

      if (flock(fd, LOCK_UN)==0)  // after finishing those tasks, unlock it
      {
            printf("C unlock\n");
      }
     }

我想在同一台主机上运行shell脚本和C程序 我希望他们可以在不同的时间交替运行 taskAtaskB 但我对flock不太熟悉,所以存在一些权限问题或者打开文件失败

例如,如果我运行 C 程序并让它完成,然后再次运行它,我得到 “打开文件失败” 并且权限是

---xr-x--T 1 esolve 200036    0 May  6 02:18 lockfile

如何修改脚本和代码? 谢谢!

最佳答案

shell 脚本中的 200 是一个文件描述符 - 请参阅手册页 flock(1) .

您的文件权限问题是,当您包含 O_CREAT 时,open(2) 需要 3 个参数;第三个参数应该是文件的权限。当您不指定第三个参数时,您会得到一些为您选择的准随机值。需要进行大量分析才能帮助您检测该问题,因为 open(2)有签名:

#include <fcntl.h>

int open(const char *path, int oflag, ...);

它是一个可变长度参数列表函数,因此大多数时候只使用两个参数就可以了,除非指定 O_CREAT 时它需要第三个参数。

关于c - 如何在C程序和shell脚本之间使用flock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16390429/

相关文章:

c - 无法在 C 中创建 shell(Seg-Fault 和 ferror)

c - 如何使用 C 创建 netcat 类型的监听器?

linux - shell程序无法运行

shell - 在 shell 脚本中捕获 mysql 输出

c - 如何在 C 中将整数拆分为单独的多位整数?

c - 为什么我的 .c 文件无法识别我的头文件? 2 个错误,XCode

c++ - 我应该如何从循环中跳出?

linux命令显示war文件中文件内容

linux - 如何知道我的程序是手动执行还是由 cron 执行或从另一个脚本执行

python - 通过 python 运行可执行文件会混淆解释器/操作系统