1

我有一个 shell 脚本和 ac 程序

    #!/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

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

4

1 回答 1

2

shell 脚本中的 200 是一个文件描述符——参见flock(1).

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

#include <fcntl.h>

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

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

于 2013-05-06T05:50:33.233 回答