(转)linux用文件锁实现保证一个程序只能启动一个进程

#include <stdio.h>

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc,char* argv[])
{
 int fd;
 int lock_result;
 struct flock lock;
 char * pFileName = "tmp.lck";
 fd = open(pFileName,O_RDWR);
 if(fd<0)
 {
  printf("Open file failed.\n");
  return 1;
 }
 lock_result = lockf(fd,F_TEST,0);  //参数使用F_LOCK,则如果已经加锁,则阻塞到前一个进程释放锁为止,参数0表示对整个文件加锁
 //返回0表示未加锁或者被当前进程加锁;返回-1表示被其他进程加锁
 if(lock_result<0)
 {
  perror("Exec lockf function failed.\n");
  return 1;
 }
 
  lock_result = lockf(fd,F_LOCK,0);  //参数使用F_LOCK,则如果已经加锁,则阻塞到前一个进程释放锁为止,参数0表示对整个文件加锁
 if(lock_result<0)
 {
  perror("Exec lockf function failed.\n");
  return 1;
 }

 printf("Pid: %ld process locked the file.\n",(long)getpid());
 
 //do something
 while(getchar()<0);
 
 printf("Pid: %ld process release the file.\n",(long)getpid());
 return 0;
}

时间: 2024-08-28 14:40:51

(转)linux用文件锁实现保证一个程序只能启动一个进程的相关文章

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

WinForm限制客户程序只能运行一个实例

WinForm限制客户程序只能运行一个实例: using System; using System.Threading; static void Main() { bool create = false; using (Mutex mu = new Mutex(true, Application.ProductName, out create)) { if (create) { Application.Run( new MainForm() ); } else { MessageBox.Show

C++ 一个程序获取另一个程序Edit控件的内容

//一个程序获取另一个程序Edit控件的内容 //根据指定程序的标题名获取改程序窗口的句柄 HWND hWnd=::FindWindow(NULL,"zhang001"); if(hWnd) { MessageBox("get windows"); //根据窗口句柄获取EDIT控件的ID,但是这个ID是通过VS工具spy++获取的 HWND h = ::GetDlgItem(hWnd,0x3E9); if (h!=NULL) { CString str0; //要知

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。

题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.例如: 输入描述: 输入N个字符 输出描述: 输出该字符串反转后的字符串 输入例子: abcd 输出例子: dcba import java.util.Scanner; public class Main {     public static void main(String[] args) {         // TODO Auto-generated method stub         Scanner in = 

WinCE C#程序,控制启动时只能启动一个程序,使用互斥量来实现,该实现方法测试通过

</pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_4634982" name="code" class="csharp"> </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_

从一个程序员到一个销售高手的心路历程

从一个程序员到一个销售高手的心路历程 0.引言 我大学本科读的是理工科,后来毕业以后,我逐渐走上了程 序员的道路.每天面对电脑一行一行的敲代码,这被我们程序员们戏称为“搬砖头”,因为我们所做的事跟民工搬砖头砌墙本质上是相同的,我们也是把一堆代码从 一个地方搬到另一个地方,然后改改让它面子上看起来挺好看,用起来结实耐用就算完工了. 干了6年的技术以后,我放弃了已做的非常 好的技术和积累起来的成绩,转而从0开始去做销售.后来经过自己的努力,我终于成长为一个销售和业绩翻倍高手,在销售和业绩翻倍方面取得

编写一个程序,指定一个文件夹,能自动计算出其总容量

package wenjianyuliu;//编写一个程序,指定一个文件夹,能自动计算出其总容量import java.io.File;import java.util.ArrayList; public class Size {   static long size=0; private static ArrayList<String> filelist=new ArrayList<String>(); public static void main(String[] args)

一个try可以跟进多个catch语句,用于处理不同情况,当一个try只能匹配一个catch

一个try可以跟进多个catch语句,用于处理不同情况.当一个try只能匹配一个catch. 我们可以写多个catch语句,但是不能将父类型的exception的位置写在子类型的excepiton之前,因为这样父类型肯定先于子类型被匹配,所有子类型就成为废话.JAVA编译出错. 在try,catch后还可以再跟一子句finally.其中的代码语句无论如何都会被执行(因为finally子句的这个特性,所以一般将释放资源,关闭连接的语句写在里面). 如果在程序中书写了检查(抛出)exception但

一个函数只能返回一个值?笑话

函数的define:若有两个变量x和y,对于x的每一个值,y都有唯一确定的值与它对应,则y与x有函数关系.一般用表示.其中x叫做自变量,y叫做因变量. 唯一的值?对啊,C语言函数中也是只能return 一个的而已,虽然你能写多个return 到C语言的函数中,可是见到第一个return 后,后面的操作都是不执行的.读者可以试试!!那么,我们怎样从一个C语言函数中得到多个值呢?我们可以用些技术吧???对的,真的可以!!!①可以利用指针,指针里放着变量的地址,如果我们改变它的指向,不就可以改变它的值