当前位置:  技术问答>linux和unix

有什么办法让某程序在操作系统中只能有一个进程在运行?

    来源: 互联网  发布时间:2016-03-14

    本文导语:  就像msn那样在windows中只能开一个窗口。 | 一个可移植性很高的办法: 让你的程序去操作一个文件,并且是非共享方式的,用C的fopen即可,如果fopen不成功,则程序退出 这样,就能确保只有一个进...

就像msn那样在windows中只能开一个窗口。

|
一个可移植性很高的办法:
让你的程序去操作一个文件,并且是非共享方式的,用C的fopen即可,如果fopen不成功,则程序退出
这样,就能确保只有一个进程存在


|
运行前先查询进程列表中有没有该进程运行。。

|
简单方法:创建一个文件
复杂方法:使用管道

|
复杂方法:使用管道->使用信号量

|
我写了个简单的示范程序,你可以将该程序启在后台,再启动程序,系统就不会再让程序启动了。
因为程序比较简单,尽量将程序名字改得特殊点。

#include 
 
void main(int argc,char* argv[])
{
  char szCmdStr[64],szGrepStr[64],szTempStr[256];
  FILE *pfPd;
  int   iCount = 0;
  
  sprintf(szCmdStr,"ps -fu%s|grep %s",getlogin(),argv[0]);
sprintf(szGrepStr,"%s",argv[0]);
if ((pfPd = popen(szCmdStr,"r")) == NULL)
{
perror("popen error");
exit(1);
}

while (fgets(szTempStr,256,pfPd) != NULL)
{
if(strstr(szTempStr,szGrepStr) != NULL && strstr(szTempStr,"remsh") == NULL
    && strstr(szTempStr,"grep") == NULL)
iCount++;
if (iCount > 1)
{
printf("There already exists a "%s %s"n",argv[0],argv[1]);
/***写系统运行日志***/
pclose(pfPd);
exit(1);
}
}
pclose(pfPd);

  sleep(10);
}

 

|
printf("There already exists a "%s %s"n",argv[0],argv[1]); 
  //argv[1]多余了。。。不过对程序不会造成影响。代码我已经测试过了,没有问题

|
使用tmpnam取得唯一文件名
或者 mkstemp生成唯一文件

|
创建一个互斥量, 
HANDLE   hMap;  
  hMap   =   CreateFileMapping((HANDLE)    
          0xFFFFFFFF,NULL,PAGE_READWRITE,0,100,_T("name"));  
  if(hMap!=NULL   &&   (GetLastError()   ==   ERROR_ALREADY_EXISTS))  
  {  
  `CloseHandle(hMap);  
  `hMap   =   NULL;  
  `exit(0);  
  }   

|
等待牛人来答.

|
这是最好的办法,就是稍微麻烦点儿,要根据不同的系统,选择不同的api

|
如楼上所讲,一般的,可移植的方法是进程起动时,检查一个文件,看是否存在,如果存在,根据文件里边存的进程号,检查进程是否存在。如果有不存在的,就把自己的进程号写入此文件。

当然,如果是针对某一系统,还会有更简单高效的方法。

    
 
 

您可能感兴趣的文章:

  • 父进程有没有办法取的子进程中某个变量的值
  • 急急 solaris 系统被自己的进程调用太多堵死了,其它系统进程也运行不了,有没有什么好的办法啊?在线等!!!!
  • 使用ps命令,如何使用系统命令根据进程名称获取进程和子进程的ID?除了ps,还有其它系统命令的办法吗?谢谢。
  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • UNIX下用 sleep 时,进程不回响应,kill 都不行,都没有别的办法?
  • 有没有办法在打开一个文件之前判断当前是否有进程在使用(读或写)该文件
  • 请问有没有办法方便提取某个已知进程所占用的socket号?谢谢
  • 有没有办法让一个进程无法通过ssh杀死
  • 如何在FreeBSD下同时的并发1000个进程???我的办法是否可行????
  • 重启或杀掉Nginx进程后丢失nginx.pid的解决办法
  • 挂载移动硬盘但只能看到第一个分区,有没有什么办法可以让所有的分区都可以访问呢?
  • 有CCNA,Scjp2,高程的计算机本科生能卖多少?(答者有分,只能给33分,没办法)
  • 有没有办法让一个Java程序只能有一个实例在运行
  • 我被安装了3721,想尽了办法想去掉它,但是无果,只能求助于大家了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有没有什么办法能够查询到某个内核模块程序加载之后的运行情况?
  • 运行Java程序时,我想把 dos窗口中的错误信息重定向到一个文本文件,请问有什么办法?
  • 有没有什么工具或办法可以将Tc 下的程序移植到linux下运行?
  • IIS7使用.NET Framework v4.0运行库报500错误的解决办法
  • 有一个7*24运行的服务程序,现在我将这个程序的输出重定向到一个文本,现在要实时读取文本内容,有什么好的办法?
  • 我的程序是linux Redhat 32位下写的,用到了不少汇编,我希望在64位的环境下运行,不改代码,有办法吗?
  • 这个程序有问题!但可以运行!我没有办法了!请大家帮忙!
  • Web服务器/前端 iis7站长之家
  • 真的有点灰心了,学java两个月才,最近在用jb6+weblogic6.1学习servlet,可使无论如何都无法运行,就连一个小小的.java格式的servlet程序我都没办法编译成.class文件,真的对java有点灰心了.....
  • window.onload事件覆盖掉body onload事件(window.onload和html body onload事件冲突)解决办法
  • 请问shell脚本中有没有办法将上一条命令的显示输出传为变量的办法,记得不是$?噢
  • 安装hadoop时出现内存不够及其它一些常见的hadoop错误解决办法
  • VMware装了ubuntu时,没有设置root的密码,现在没有办法打开root账户,网上的很多办法都试了。
  • linux/centos安装nginx常见错误及解决办法
  • 请问用rm 命令删掉的目录(含文件)有什么办法恢复?
  • 有什么办法让KDE注销时选择注销、重启还是关机?
  • 救命.PHP没有办法调用MYSQL!!!!
  • 虚拟机-虚拟光驱的搭配,有安装LINUX成功的办法么?
  • 根目录满了,有什么办法可以扩容?
  • 访问Access数据库,除了JDBD-ODBC桥,是否还有别的办法?
  • Sql Server忘记密码的解决办法
  • 在VAJ中有办法改变核心的JAVA包吗?
  • 就没别的办法了?---关于applet,swing,IE
  • 有什么办法能把复制到硬盘再装吗?
  • 有没有办法在JSP中刷新页面?请高手指点。
  • 显示器(AXION)不支持LINUX图形界面,有没有解决办法
  • 请问,有什么办法可以把html文件生成pdf/excel格式的文件
  • 有没有办法当按下机箱上的电源按钮后让linux正常关机?
  • 我想要redhat9。0里面的图标,不知道大侠们有没有办法?
  • 请问:我的F盘没有办法转化成NTFS格式


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3