1、linux semop 有超时吗
【semop系统调用】
功能描述:
操作一个或一组信号。
用法:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);
参数:
semid:信号集的识别码,可通过semget获取。
sops:指向存储信号操作结构的数组指针,信号操作结构的原型如下
struct sembuf
{
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
这三个字段的意义分别为:
sem_num:操作信号在信号集中的编号,第一个信号的编号是0。
sem_op:如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。
sem_flg:信号操作标志,可能的选择有两种
IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
IPC_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。
nsops:信号操作结构的数量,恒大于或等于1。
timeout:当semtimedop()调用致使进程进入睡眠时,睡眠时间不能超过本参数指定的值。如果睡眠超时,semtimedop()将失败返回,并设定错误值为EAGAIN。如果本参数的值为NULL,semtimedop()将永远睡眠等待。
返回说明:
成功执行时,两个系统调用都返回0。失败返回-1,errno被设为以下的某个值
E2BIG:一次对信号的操作数超出系统的限制
EACCES:调用进程没有权能执行请求的操作,并且不具有CAP_IPC_OWNER权能
EAGAIN:信号操作暂时不能满足,需要重试
EFAULT:sops或timeout指针指向的空间不可访问
EFBIG:sem_num指定的值无效
EIDRM:信号集已被移除
EINTR:系统调用阻塞时,被信号中断
EINVAL:参数无效
ENOMEM:内存不足
ERANGE:信号所允许的值越界
2、怎么设置linux 信号量 超时
信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,
消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名
无名使用 <semaphore.h>,
有名信号量<sys/sem.h>
无名信号量不能用进程间通信,
//无名与有名的区别,有名需要KEY值与IPC标识
所以sem_init的第二个参数必须为0,
3、linux下 如何判断信号量延时
/*编译命令:gcc -o shm shm.c -g */
2
3#include<sys/sem.h>
4#include<sys/ipc.h>
5
6#define SEGSIZE 1024
7#define READTIME 1
8
9union semum
10{
11 int val;
12 struct semid_ds *buf;
13 unsigned short *array;
14}arg;
15
16/* 创建信号量 */
17int sem_creat(key_t key)
18{
19 union semun sem;
20 int semid;
21 sem.val = 0;
22 semid = semget(key, 1, IPC_CREAT | 0666);
23
24 if (semid == -1)
25 {
26 printf("Create semaphore error\n");
27 exit(-1);
28 }
29
30 semctl(semid, 0, SETVAL, sem);
31
32 return semid;
33}
34
35/* 删除信号量*/
36int del_sem(int semid)
37{
38 union semun sem;
39 sem.val = 0;
40 semctl(semid, 0, IPC_RMID, sem);
41}
42
43/* 信号量的P操作,使得信号量的值加1 */
44int p(int semid)
45{
46 struct sembuf sops = {0,
47 +1,
48 IPC_NOWAIT
49 };
50
51 return (semop(semid, &sops, 1));
52}
53
54/* 信号量的v操作,使得信号量的值减1 */
55int v(int semid)
56{
57 struct sembuf sops = {0,
58 -1,
59 IPC_NOWAIT
60 };
61
62 return (semop(semid, &sops, 1));
63}
64
65/* server主程序 */
66int main(int argc, char **argv)
67{
68 key_t key;
69 int shmid, semid;
70 char *shm;
71 char msg[7] = "-data-";
72 char i;
73 struct semid_ds buf;
74
75 key = ftok("/", 0);
76 shmid = shmget(key, SEGSIZE, IPC_CREAT|0604);
77
78 if shmid == -1)
79 {
80 printf(" create shared memory error\n");
81 return -1;
82 }
83
84 shm = (char *)shmat(shmid, 0, 0);
85 if (-1 == (int)shm)
86 {
87 printf(" attach shared memory error\n");
88 return -1;
89 }
90
91 semid = sem_creat(key);
92
93 for (i = 0; i <= 3; i++)
94 {
95 sleep(1);
96 p(semid);
97 sleep(READTIME);
98 msg[5] = '0' + i;
99 memcpy(shm,msg,sizeof(msg));
100 sleep(58);
101 v(semid);
102 }
103
104 shmdt(shm);
105
106 shmctl(shmid,IPC_RMID,&buf);
107
108 del_sem(semid);
109
110 return 0;
111
112}
113
114
115
116
117
118
119
120
121
4、请问linux环境下如何判断子进程超时或者超内存? (Ubuntu 12.04)
建议你买台专业服务器带ECC内存的那种可以省去很多麻烦,有些时候不管是linux还是windows出现错误往往都是内存系统问题,不适合运行大运算量的程序!
5、linux下,用gcc编译c代码,error:undefined reference to sem_wait 怎么解决?谢谢! 请问 在哪儿找到的
#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
Link with -lrt or -pthread.
自己看最后一句....手册里面写着呢....link with -lrt or -pthread
6、急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为什么编译时说sem_wait,sem_post等未定义的引用
编译时加上参数:-lpthread
要看报错的阶段,是在编译还是链接阶段.
如果编译时函数没有找到,那是头文件的问题,如果链接时未定义引用,那是c库的问题.
如果你的头文件都正常包含了,那可能你的c库没有使能semaphore的支持.
7、linux C编程 信号量sys/sem 有等待超时么
可以用semtimedop
8、在linux里面 FIN-WAIT-1 停留多久
如果出现这种情况,基本就在那里等了,因为FIN-WAIT-1的状态等待是没有超时的,主要原因是不明确Server端应用的情况,不能够设置超时,在这个层面上就只能傻等。