linux 多程序的同步:linux多程序我實現同步操作,操作單個訊號量已經不能實現,對多程序的通訊可以採取訊號集的方式,乙個訊號集包含了多個訊號量。
首先通過semget()建立訊號量。例如:semid = semget(semkey,2,0600|iflags;
然後對訊號集中各個訊號量賦初值:
semctl(semid,0,setval,0);
semctl(semid,1,setval,1);
也可以通過 set_sem_value(semid,0,1),對訊號集為semid重的第乙個訊號量賦初始值為1
void set_sem_value(int semid,int num ,int val)
然後就是類似於pv原語的操作。
注意一下下面的這個機構體:
struct sembuf p1 = ,p2 = ,
v1 = ,v2 = ;
然後利用 int semop(int semid, struct sembuf *sops, unsigned nsops); 進行pv操作!。下面是具體的**:
/**************************************produce.c*******************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define shmkey (key_t) 0x100
#define semkey (key_t) 0x200
#define iflags (ipc_creat|ipc_excl)
#define err ((struct databuf *) -1)
struct databuf;
static int shmid,semid;
pr_error(char *mess)
getseg(struct databuf* *pdata)
else
pr_error("shmget");
} /*取得共享記憶體的指標,使用共享記憶體時可以和malloc分配的記憶體一樣*/
if((*pdata = (struct databuf *)(shmat(shmid,0,0))) == err)
pr_error("shmat");
} int getsem()
else
pr_error("semget");
} /*設定訊號量a初值為0*/
if(semctl(semid,0,setval,0) < 0)
pr_error("semctl");
/*設定訊號量b初值為1*/
if(semctl(semid,1,setval,1) < 0)
pr_error("semctl");
return(semid);
} void remove_s()
main()
struct sembuf p1 = ,p2 = ,
v1 = ,v2 = ;
writer(int semid,struct databuf *buf)
sleep(5);
/*v(a) a==1,喚醒消費者程序,讀緩衝區*/
semop(semid,&v1,1);
} return;
} /****************************consumer.c***************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define shmkey (key_t) 0x100
#define semkey (key_t) 0x200
#define iflags (ipc_creat|ipc_excl)
#define err ((struct databuf *) -1)
struct databuf;
static int shmid,semid;
pr_error(char *mess)
getseg(struct databuf* *pdata)
else
pr_error("shmget");
} /*取得共享記憶體的指標,使用共享記憶體時可以和malloc分配的記憶體一樣*/
if((*pdata = (struct databuf *)(shmat(shmid,0,0))) == err)
pr_error("shmat");
} int getsem()
else
pr_error("semget");
} /*設定訊號量a初值為0*/
if(semctl(semid,0,setval,0) < 0)
pr_error("semctl");
/*設定訊號量b初值為1*/
if(semctl(semid,1,setval,1) < 0)
pr_error("semctl");
return(semid);
} main()
struct sembuf p1 = ,p2 = ,
v1 = ,v2 = ;
reader(int semid, struct databuf *buf)
printf("\n");
semop(semid,&v2,1);
/*v(b) b++,喚醒寫程序*/
} return;
}
Linux下的多程序程式設計
linux下乙個程序在記憶體裡有三部份的資料,就是 資料段 堆疊段 和 段 其實學過組合語言的人一定知道,一般的cpu象i386,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...
多程序共享 同步
usr bin python coding utf 8 from multiprocessing import process,array,value deff n,a n.value 3.1415926 for i in range 5 a i a i if name main num value...
多程序IO同步
由sharpdevelop建立。使用者 administrator 日期 2018 03 31 要改變這種模板 工具 選項 編寫 編輯標準標頭檔案 usingsystem usingsystem.runtime.serialization.json usingsystem.io usingsyste...