当前位置: 技术问答>linux和unix
有什么办法让某程序在操作系统中只能有一个进程在运行?
来源: 互联网 发布时间:2016-03-14
本文导语: 就像msn那样在windows中只能开一个窗口。 | 一个可移植性很高的办法: 让你的程序去操作一个文件,并且是非共享方式的,用C的fopen即可,如果fopen不成功,则程序退出 这样,就能确保只有一个进...
就像msn那样在windows中只能开一个窗口。
|
一个可移植性很高的办法:
让你的程序去操作一个文件,并且是非共享方式的,用C的fopen即可,如果fopen不成功,则程序退出
这样,就能确保只有一个进程存在
让你的程序去操作一个文件,并且是非共享方式的,用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);
}
因为程序比较简单,尽量将程序名字改得特殊点。
#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]多余了。。。不过对程序不会造成影响。代码我已经测试过了,没有问题
//argv[1]多余了。。。不过对程序不会造成影响。代码我已经测试过了,没有问题
|
使用tmpnam取得唯一文件名
或者 mkstemp生成唯一文件
或者 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);
}
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
|
如楼上所讲,一般的,可移植的方法是进程起动时,检查一个文件,看是否存在,如果存在,根据文件里边存的进程号,检查进程是否存在。如果有不存在的,就把自己的进程号写入此文件。
当然,如果是针对某一系统,还会有更简单高效的方法。
当然,如果是针对某一系统,还会有更简单高效的方法。