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端應用的情況,不能夠設置超時,在這個層面上就只能傻等。