#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
#define MAX_TEXT 1024
int main(int argc,char **argv){
int semid=0;
int count=0;
pid_t pd=0;
struct sembuf sops;
semid=semget((key_t)12345,3,0666|IPC_CREAT);
if(semid==-1){
perror("semget()");
exit(1);
}
printf("Begin fork()\n");
for(count=0;count<3;count++){
pd=fork();
if(pd<0){
perror("fork()");
exit(1);
}
if(pd==0){
printf("child[%d] creat!\n",getpid());
sops.sem_num=count;
sops.sem_op=-1;
sops.sem_flg=0;
if(semop(semid,&sops,1)==-1){
perror("semop()");
exit(1);
}
printf("child [%d] exit!\n",getpid());
exit(0);
}
}
exit(0);
}
semread1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
#define MAX_TEXT 1024
int main(int argc,char **argv){
int semid=0;
struct sembuf sops;
if(argc!=2){
printf("sem_send:usage error.\n");
exit(1);
}
semid=semget((key_t)12345,3,0666|IPC_CREAT);
if(semid==-1){
perror("semget()");
exit(1);
}
if(strncmp(argv[1],"0",1)==0){
sops.sem_num=0;
}else if(strncmp(argv[1],"1",1)==0){
sops.sem_num=1;
}else if(strncmp(argv[1],"2",1)==0){
sops.sem_num=2;
}else{
printf("argument:count error.\n");
exit(1);
}
sops.sem_op=1;
sops.sem_flg=SEM_UNDO;
if(semop(semid,&sops,1)==-1){
perror("semop()");
exit(1);
}else{
printf("semop(%d) over.\n",sops.sem_num);
}
exit(0);
}
semwrite1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/types.h>
int main(int argc,char **argv){
int fd=0;
int shmid=0;
char *buf;
fd=open("/etc/passwd",O_RDONLY);
if(fd<0){
perror("open()");
exit(1);
}
shmid=shmget((key_t)12345,4096,0666|IPC_CREAT);
if(shmid<0){
perror("shmget()");
exit(1);
}
buf=(char *)shmat(shmid,NULL,0);
if(buf==(void *)-1){
perror("shmat()");
exit(1);
}
if(read(fd,buf,1024)==-1){
perror("read()");
exit(1);
}else{
printf("write successful.\n");
}
if(shmdt(buf)==-1){
perror("shmdt()");
exit(1);
}
exit(0);
}
sharedMemoryread1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/types.h>
int main(int argc,char **argv){
int fd=0;
int shmid=0;
char *buf;
shmid=shmget((key_t)12345,4096,0666|IPC_CREAT);
if(shmid<0){
perror("shmget()");
exit(1);
}
buf=(char *)shmat(shmid,NULL,0);
if(buf==(void *)-1){
perror("shmat()");
exit(1);
}
if(strcmp(buf,"")==0){
printf("readnothing\n");
}else{
printf("read: %s\n",buf);
}
if(shmdt(buf)==-1){
perror("shmdt()");
exit(1);
}
exit(0);
}
sharedMemorywrite1.c
这两种通信方式比较前一博客(3)中,使用的较多,共享内存也可以参考一下ftok函数。