如何保证同时只有一个程序在系统中运行
2010-10-25 20:57
483 查看
1、pgrep: 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了;
用法:
#ps 参数选项 程序名
常用参数
-l 列出程序名和进程ID;
-o 进程起始的ID;
-n 进程终止的ID;
举例:
[root@localhost ~]# pgrep -lo httpd
4557 httpd
[root@localhost ~]# pgrep -ln httpd
4566 httpd
[root@localhost ~]# pgrep -l httpd
4557 httpd
4560 httpd
4561 httpd
4562 httpd
4563 httpd
4564 httpd
4565 httpd
4566 httpd
[root@localhost ~]# pgrep httpd
4557
4560
4561
4562
4563
4564
4565
4566
通过执行pgrep,判断返回的结果中是否有两个同样的程序在运行,并加以判断就可以保证。该方法可以保证程序崩溃后也能再启动,而不是使用文件锁这种不能判断的。
2、popen()系统调用:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
描述
popen() 函数 用 创建管道 的 方式 启动 一个 进程, 并调用 shell. 因为 管道 是被定义成 单向的, 所以 type 参数 只能 定义成 只读 或者 只写, 不能是 两者同时, 结果流 也相应的 是 只读 或者 只写.
command
参数 是 一个 字符串指针, 指向的 是 一个 以 null 结束符 结尾的字符串, 这个 字符串 包含 一个 shell 命令. 这个命令
被送到 /bin/sh 以 -c 参数 执行, 即由 shell 来执行. type 参数 也是 一个 指向 以 null 结束符 结尾的
字符串的指针, 这个字符串 必须是 'r' 或者 'w’ 来指明 是 读还是写.
popen() 函数 的 返回值 是 一个 普通的 标准I/O流, 它只能用 pclose()
函数 来关闭, 而不是 fclose(). 函数. 向 这个流 的 写入 被转化为 对 command 命令的 标准输入; 而 command
命令的 标准输出 则是和 调用 popen(), 函数 的 进程 相同,除非 这个 被command命令 自己 改变. 相反的, 读取 一个
“被popen了的” 流, 就相当于 读取 command 命令的 标准输出, 而 command 的 标准输入 则是和 调用 popen,
函数的 进程 相同.
注意, popen 函数的 输出流 默认是 被全缓冲的.
可以在程序启动的时候执行利用popen 执行“pgrep programname",然后判断其输出。例如程序文件名为test,则在程序启动时可编写如下程序:
#include <stdio.h>
int main(void)
{
char buffer[128];
FILE *fp;
int i=0;
memset( buffer,sizeof(buffer),0 );
if( ( fp=popen( "pgrep test","r" ) ) == NULL )
{
printf( "Can not execute pgrep !/n" );
return;
}
while( fgets( buffer,sizeof(buffer),fp ) )
{
i++;
}
if( i>1 )
return 0;
continue..........//继续后续程序的执行
}
用法:
#ps 参数选项 程序名
常用参数
-l 列出程序名和进程ID;
-o 进程起始的ID;
-n 进程终止的ID;
举例:
[root@localhost ~]# pgrep -lo httpd
4557 httpd
[root@localhost ~]# pgrep -ln httpd
4566 httpd
[root@localhost ~]# pgrep -l httpd
4557 httpd
4560 httpd
4561 httpd
4562 httpd
4563 httpd
4564 httpd
4565 httpd
4566 httpd
[root@localhost ~]# pgrep httpd
4557
4560
4561
4562
4563
4564
4565
4566
通过执行pgrep,判断返回的结果中是否有两个同样的程序在运行,并加以判断就可以保证。该方法可以保证程序崩溃后也能再启动,而不是使用文件锁这种不能判断的。
2、popen()系统调用:
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
描述
popen() 函数 用 创建管道 的 方式 启动 一个 进程, 并调用 shell. 因为 管道 是被定义成 单向的, 所以 type 参数 只能 定义成 只读 或者 只写, 不能是 两者同时, 结果流 也相应的 是 只读 或者 只写.
command
参数 是 一个 字符串指针, 指向的 是 一个 以 null 结束符 结尾的字符串, 这个 字符串 包含 一个 shell 命令. 这个命令
被送到 /bin/sh 以 -c 参数 执行, 即由 shell 来执行. type 参数 也是 一个 指向 以 null 结束符 结尾的
字符串的指针, 这个字符串 必须是 'r' 或者 'w’ 来指明 是 读还是写.
popen() 函数 的 返回值 是 一个 普通的 标准I/O流, 它只能用 pclose()
函数 来关闭, 而不是 fclose(). 函数. 向 这个流 的 写入 被转化为 对 command 命令的 标准输入; 而 command
命令的 标准输出 则是和 调用 popen(), 函数 的 进程 相同,除非 这个 被command命令 自己 改变. 相反的, 读取 一个
“被popen了的” 流, 就相当于 读取 command 命令的 标准输出, 而 command 的 标准输入 则是和 调用 popen,
函数的 进程 相同.
注意, popen 函数的 输出流 默认是 被全缓冲的.
可以在程序启动的时候执行利用popen 执行“pgrep programname",然后判断其输出。例如程序文件名为test,则在程序启动时可编写如下程序:
#include <stdio.h>
int main(void)
{
char buffer[128];
FILE *fp;
int i=0;
memset( buffer,sizeof(buffer),0 );
if( ( fp=popen( "pgrep test","r" ) ) == NULL )
{
printf( "Can not execute pgrep !/n" );
return;
}
while( fgets( buffer,sizeof(buffer),fp ) )
{
i++;
}
if( i>1 )
return 0;
continue..........//继续后续程序的执行
}
相关文章推荐
- 技巧(5)- 如何让这个程序在系统里同时只运行一个(如果这个exe程序已经运行了,就不再运行)
- 保证该程序只有一个在运行
- 保证程序只有一个实例运行 &&& 动态调用DLL的研究
- 保证系统中只运行一个程序实例
- Delphi编写系统服务四:如何限制系统服务和桌面程序只运行一个
- 利用两个BrocastReceiver来保证同时只有一个实例在运行
- oracle中的sys用户(修改密码)/////Oracle删除表空间的同时删除数据文件 ///// Oracle中如何保证用户只有一个session登录
- WinForm程序,保证只有一个实例在运行(网上搜集的东西)
- 保证当前只有一个程序在运行
- 保证程序只有一个运行实例
- 保证一个程序只有一个应用程序在运行
- 如何保证程序运行时系统时间不被修改!
- 保证系统中只运行当前程序的一个进程
- Delphi编写系统服务四:如何限制系统服务和桌面程序只运行一个
- 保证Winform程序只有一个实例在运行
- 利用文件锁保证一个程序最多只有一份拷贝在运行
- 使用互斥量保证程序最多只有一个实例运行
- EOS非Portal模式下,如何开发一个用户登录验证程序,用户只有在登录验证通过后,方可访问系统。
- 如何用codeblocks同时运行一个工程里的两个程序
- 如何让程序只有一个实例运行(用tftp时的感想)?