- 论坛徽章:
- 0
|
求教:使用 fork() 的方法
原帖由 "flw" 发表:
你这只是给了他一顿饭!精神固然可嘉,但是他能不能消化,尚未可知。
....
..我是给了他一条觅食的道!虽然这条道不一定对他有用,但是这立意首先就要比你高!
饿着肚子还赶什么路?燕窝参汤可以慢用,小米饭就不能消化了?
只是顺着风向敲几个字,干吗这么认真,你一米九几?
----------------
多程序间共享内存的例子程序的部分代码:
1.Server端程序
# define SEGSIZE 1024
# define READTIME 1
union semun {
int val;
struct semid_ds* buf;
ushort_t* array;
} ;
//生成信号量
int sem(key_t key){
union semun sem ;
int semid;
sem.val=0;
semid=semget(key,1,IPC_CREAT|0666);
if (semid ==- 1){
printf(" create semaphore error\n" );
exit(- 1);
}
//初始化信号量
semctl(semid,0,SETVAL,sem);
return semid;
}
//删除信号量
void d_sem(int semid){
union semun sem ;
sem.val=0;
semctl(semid,0,IPC_RMID,0);
}
int p(int semid){
struct sembuf sops={0,+ 1,IPC_NOWAIT};
return(semop(semid,& sops,1));
}
int v(int semid){
struct sembuf sops={0,- 1,IPC_NOWAIT};
return(semop(semid,& sops,1));
}
int main(){
key_t key;
int shmid,semid;
char* shm;
char msg[7]=" data " ;
char i;
struct shmid_ds buf;
key=ftok(" /" , 0);
shmid=shmget(key,SEGSIZE,IPC_CREAT|0604);
if(shmid ==- 1){
printf(" create shared momery error\n" );
return- 1;
}
shm=(char* )shmat(shmid,0,0);
if((int)shm ==- 1){
printf(" attach shared momery error\n" );
return- 1;
}
semid=sem(key);
for(i=0;i<=3;i++ ){
sleep(1);
p(semid);
sleep(READTIME);
msg[5]=' 0'+ i;
memcpy(shm,msg,sizeof(msg));
sleep(5 ;
v(semid);
}
shmdt(shm);
shmctl(shmid,IPC_RMID,& buf);
d_sem(semid);
return 0;
}
2.Client端程序# define SEGSIZE 1024
union semun {
int val;
struct semid_ds* buf;
ushort_t* array;
} ;
//打印程序执行时间
void secondpass(){
static long start=0;
time_t timer;
if (start == 0){
timer=time(NULL);
start=(long)timer;
printf(" now start \n" );
}
printf(" second:% ld \n" ,(long)(time(NULL))- start);
}
int sem(key_t key){
union semun sem ;
int semid;
sem.val=0;
semid=semget(key,0,0);
if (semid ==- 1){
printf(" get semaphore error\n" ;
exit(- 1);
}
return semid;
}
//等待信号量变成 0
void waitv(int semid){
struct sembuf sops={0,0,0};
semop(semid,& sops,1);
}
int main(){
key_t key;
int shmid,semid;
char* shm;
char msg[100];
int i;
key=ftok(" /" , 0);
shmid=shmget(key,SEGSIZE,0);
if(shmid ==- 1){
printf(" get shared momery error\n" );
return- 1;
}
shm=(char* )shmat(shmid,0,0);
if((int)shm ==- 1){
printf(" attach shared momery error\n" );
return- 1;
}
semid=sem(key);
for(i=0;i< 3;i++ ){
sleep(2);
waitv(semid);
printf(" the msg get is \n% s\n" ,shm+ 1);
secondpass();
}
shmdt(shm);
return 0;
}
本程序在 Solaris 7下编译通过。 |
|