繁体   English   中英

如何在C程序和Shell脚本之间使用flock

[英]how to use flock between C program and shell script

我有一个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

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

Shell脚本中的200是文件描述符-请参见手册页flock(1)

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

#include <fcntl.h>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM