色卡网站,做行业门户网站要投资多少钱,深圳网站建设专业的公司,网站报价系统进程间通信方式通常有共享内存 信号量 消息队列 管道 FIFO Socket等几种。 共享内存的模型#xff0c;它是最有效率的进程间通信方式进程间信号量是进程间同步主要方式#xff0c;信号量操作为负的时候#xff0c;进程阻塞。直到信号量为正 内存映射是一种特殊的共享内存… 进程间通信方式通常有共享内存 信号量 消息队列 管道 FIFO Socket等几种。 共享内存的模型它是最有效率的进程间通信方式 进程间信号量是进程间同步主要方式信号量操作为负的时候进程阻塞。直到信号量为正 内存映射是一种特殊的共享内存方式只是本质上是对文件的操作 管道是亲戚进程间通信的常用方式常用于输入输出重定向 Fifo也成为命名管道可用于无关联进程之间 Socket是唯一一个不同主机间进程通信的方式 下面简单介绍一下他们的特点与功能 共享内存分配 绑定 脱离 释放 1效率高特别是大数据量通信 2各进程需要协调共同的键值需要提供额外机制防止竞争条件 3异步通信 4和信号量一同使用 内存映射(多进程共享文件进行通信的机制) 1分配内存 2读入文件内容至内存 3内存的内容回写到文件 信号量 1线程信号量:同步多线程环境的计数器。 2进程间同步的信号量: System V信号量操作和sharedmemory类似。 消息队列 1打开或创建消息队列 2读写操作 3获得或设置队列属性 管道 1单向信息的传递设备 2用于进程的线程之间或者是父子进程之间通信 3自动同步进程(管道的容量是有限的当管道写满的时候写入端自动阻塞管道容量4096字节) FIFO 1在文件系统中是一个有名字的管道 2任何进程都可以打开 3进程间无需关联 SocketSocket 1是一种双向通信设备 2同一主机不同进程间通信 3不同主机间的通信 以下是一些程序帮助大家理解 共享内存 #includestdio.h #includesys/shm.h #includestring.h #includefcntl.h #includesys/stat.h int main() { pid_t pid; int share_id; share_idshmget(IPC_PRIVATE,getpagesize(),IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR ); pidfork(); if(pid0) { char *share1NULL; share1(char*) shmat (share_id, 0,0); memset(share1,0,getpagesize()); strcpy(share1,hello,everyone\n); shmdt(share1); } else if(pid0) { char *share2NULL; share2(char*) shmat(share_id,0,0); printf(read characters from memory!\n); printf(%s\n,share2); shmdt(share2); shmctl(share_id,IPC_RMID,0); } return 1; } 信号量 #include sys/types.h #include sys/ipc.h #include sys/sem.h #includestdio.h #includesys/stat.h #includefcntl.h #includeunistd.h #define MAX 3 union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *_buf; }; int sig_alloc(key_t key, int sem_flags) { return semget (key, MAX, sem_flags); } int sig_destory (int semid,int numth) { union semun ignored_argument; return semctl (semid, numth, IPC_RMID,ignored_argument); } /* parray is a set of initialized value */ int sig_init (int semid,int *parray) { union semun argument; int i0; for(i0;iMAX;i) { // values[i] *(parrayi); argument.array parray; semctl (semid, i, SETALL, argument); } } int sig_wait(int semid,int numth) { struct sembuf operations[MAX]; operations[numth-1].sem_num numth-1; operations[numth-1].sem_op -1; operations[numth-1].sem_flg SEM_UNDO; return semop(semid,operations,1); } int sig_post(int semid,int numth) { struct sembuf operations[MAX]; operations[numth-1].sem_num numth-1; operations[numth-1].sem_op 1; operations[numth-1].sem_flg SEM_UNDO; return semop(semid,operations,1); } int main() { pid_t pid; int sig_id,i0; int sig_val[MAX]{1,0,0}; sig_idsig_alloc(0,IPC_CREAT); sig_init(sig_id,sig_val); pidfork(); if(pid0) { while(i10) { sig_wait(sig_id,3); printf(*************** \n); sig_post(sig_id,3); } } else if(pid) { i0; while(i10) { sig_wait(sig_id,1); printf(\n); sig_post(sig_id,1); } } return 1; } 内存映射 #include sys/mman.h #include sys/types.h #includestdio.h #includestring.h #includesys/stat.h #includestdlib.h #includefcntl.h #includeunistd.h #define FILE_LENGTH 100 int main(int argc,char **argv) { int fd1,fd2; char *pfileNULL; char *loadNULL; int num; if(argc3) { printf(please input more file\n); return 0; } fd1open(argv[1],O_RDONLY); fd2open(argv[2],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); printf(fd2%d\n,fd2); //fd2open(argv[2],O_WRONLY); lseek (fd2, FILE_LENGTH1, SEEK_SET); write (fd2, , 1); lseek (fd2, 0, SEEK_SET); printf(num%d\n,num); printf(fd2%d\n,fd2); pfile(char*)mmap(0,FILE_LENGTH,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd2,0); read(fd1,pfile,FILE_LENGTH); write(fd2,pfile,FILE_LENGTH); close(fd2); printf(pfile%d\n,pfile); munmap(pfile,FILE_LENGTH); close(fd1); return 1; } 管道 #include sys/mman.h #include sys/types.h #includestdio.h #includestring.h #includesys/stat.h #includestdlib.h #includefcntl.h #includeunistd.h int main () { int fds[2]; pid_t pid; pipe (fds); pid fork (); if (pid (pid_t) 0) { char str[10000]; sleep(1); close(fds[1]); read(fds[0],str,10000); printf(%s,str); close(fds[0]); } else if(pid0) { FILE*fp; char a[80]; close(fds[0]); fp(fopen(copy1.c,r)); if(fpNULL) { printf(can not open!!); exit(0); } else { while(1) { if(fread(a,80,1,fp)0) break; write(fds[1],a,sizeof(a)); } } wait(); close(fds[1]); fclose(fp); return 0; } 转载于:https://www.cnblogs.com/3ddan/p/3251979.html