【问题标题】:how to use flock between C program and shell script如何在C程序和shell脚本之间使用flock
【发布时间】:2013-04-29 17:13:16
【问题描述】:

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

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

在C程序中,相关代码sn-ps为:

    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

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

【问题讨论】:

    标签: c linux shell flock


    【解决方案1】:

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

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

    #include <fcntl.h>
    
    int open(const char *path, int oflag, ...);
    

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

    【讨论】:

    • 在 C 代码中为 open() 调用添加权限:open("lockfile", O_WRONLY|O_CREAT, 0600); — 但我很困惑,您无法从主要答案中推断出这一点。您可以使用任何您喜欢的权限; 0600 表示您可以访问该文件,但其他人无法访问。这是使用八进制常数非常明智的时候之一(使用 0x180 更难理解)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多