当前位置: 技术问答>linux和unix
寻求 Linux 进程互斥的方法,谢谢!
来源: 互联网 发布时间:2016-05-09
本文导语: 问个问题,对于有些来说也许很简单。 关于Linux下进程互斥的方法,就是启动一个Linux运行程序,只能被运行一次,第二次运行的时候检测互斥信号量,如果存在便退出该进程。 我所知道的VC创建信号量的方法,但不...
问个问题,对于有些来说也许很简单。
关于Linux下进程互斥的方法,就是启动一个Linux运行程序,只能被运行一次,第二次运行的时候检测互斥信号量,如果存在便退出该进程。
我所知道的VC创建信号量的方法,但不知道Linux下如何创建的,请高手给几句话参考一下。
或者推荐一些其他更有效更合理的做法。
谢谢
关于Linux下进程互斥的方法,就是启动一个Linux运行程序,只能被运行一次,第二次运行的时候检测互斥信号量,如果存在便退出该进程。
我所知道的VC创建信号量的方法,但不知道Linux下如何创建的,请高手给几句话参考一下。
或者推荐一些其他更有效更合理的做法。
谢谢
|
sem = sem_open("/var/.vp", O_CREAT, SEM_MODE);
这句错误。当为sem_open指定O_CREAT时,后边要带两个参数的,除了mode,还需要一个值。
另外,在/var目录下有写权限吗?
这句错误。当为sem_open指定O_CREAT时,后边要带两个参数的,除了mode,还需要一个值。
另外,在/var目录下有写权限吗?
|
后面跟了什么值??
[code=BatchFile]
#include
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value);
If O_CREAT is specified in oflag, then two additional arguments must be
supplied. The mode argument specifies the permissions to be placed on the
new semaphore, as for open(2). The permissions settings are masked against
the process umask. Both read and write permission should be granted to
each class of user that will access the semaphore. The value argument
specifies the initial value for the new semaphore. If O_CREAT is speci-
fied, and a semaphore with the given name already exists, then mode and
value are ignored.
[/code]
mode必须给自己读写权限,value是默认初始值。楼主分别穿了什么参数?
在sem = sem_open("/var/.vp", O_CREAT, SEM_MODE);
后面追加
[code=BatchFile]
#include
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
mode_t mode, unsigned int value);
If O_CREAT is specified in oflag, then two additional arguments must be
supplied. The mode argument specifies the permissions to be placed on the
new semaphore, as for open(2). The permissions settings are masked against
the process umask. Both read and write permission should be granted to
each class of user that will access the semaphore. The value argument
specifies the initial value for the new semaphore. If O_CREAT is speci-
fied, and a semaphore with the given name already exists, then mode and
value are ignored.
[/code]
mode必须给自己读写权限,value是默认初始值。楼主分别穿了什么参数?
在sem = sem_open("/var/.vp", O_CREAT, SEM_MODE);
后面追加
int err = errno;
printf("ERRNO:[%d]", err);
|
c语言如何实现只运行单个进程实例?
参考上文,简单的方法是在确定的目录下创建一个文件,然后用文件锁。如果能加锁,说明是First进程,否则说明已有进程,退出即可。
用文件锁的好处是,当进程异常退出时,内核会自动释放其持有的文件锁,这样不会引起无法再次启动的问题。
其他手段很多、大概分成两类。
第一类是使用系统资源,文件、有名管道、共享内存、信号灯等等。
第二类是建立自己的监测体系,例如使用demon监视进程状态等等。这种方式也离不开进程间通信的。
参考上文,简单的方法是在确定的目录下创建一个文件,然后用文件锁。如果能加锁,说明是First进程,否则说明已有进程,退出即可。
用文件锁的好处是,当进程异常退出时,内核会自动释放其持有的文件锁,这样不会引起无法再次启动的问题。
其他手段很多、大概分成两类。
第一类是使用系统资源,文件、有名管道、共享内存、信号灯等等。
第二类是建立自己的监测体系,例如使用demon监视进程状态等等。这种方式也离不开进程间通信的。
|
楼上讲的很全面了。
//信号量。
#include
#include
#include
#define SEM_MODE (S_IRUSR | S_IWUSR)
int
main(void)
{
sem_t *sem;
sem = sem_open("/posixsem", O_CREAT, SEM_MODE);
return (0);
}
//信号量。
#include
#include
#include
#define SEM_MODE (S_IRUSR | S_IWUSR)
int
main(void)
{
sem_t *sem;
sem = sem_open("/posixsem", O_CREAT, SEM_MODE);
return (0);
}
|
二楼的解释得很清楚,三楼和四楼的代码都可以用.三楼的是用信号量,就是你问的问题的方法了。四楼的用文件锁,就是二楼所说的简单的方法了。其实这些方法都差不多.
|
这个好像你问过一次了
|
为啥 open 后fd的返回一直是3呢,?
stdin, stdout, sderr由shell分配了0,1,2
open 打开的文件返回的文件描述符是没有被站用的描述符中最小的.
stdin, stdout, sderr由shell分配了0,1,2
open 打开的文件返回的文件描述符是没有被站用的描述符中最小的.
|
我记得在linux线程编程里边也有互斥量的建立。有专门函数的。
|
sign,学习了。。。