linux 下多程序的同步

2021-06-01 01:24:44 字數 3101 閱讀 6196

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...