进程间通信和同步:pipe、FIFO、消息队列、信号量、共享内存、信号


一、半双工管道(pipe)

<unistd.h><stdio.h><limits.h><sys/types.h><errno.h><stdlib.h> MAXLINE 1024 fd[(pipe(fd) < ((pid = fork()) < (pid == ) ]); (read(fd[], buf, MAXLINE) < ]); (write(fd[], , ) !=

编译运行结果:

<sys/types.h><errno.h><unistd.h><stdio.h><stdlib.h><unistd.h> BUFSIZE 1024 fd1[], fd2[(pipe(fd1) < || pipe(fd2) < (write(fd1[], , ) != (read(fd2[], &c, ) != (c != (write(fd2[], , ) != (read(fd1[], &c, ) != (c != ((pid = fork()) < (pid == (

编译运行结果:

<stdio.h><stdlib.h><errno.h><unistd.h><fcntl.h><sys/types.h><sys/stat.h> FIFO "/home/zhu/network/fifo/myfifo" OPEN_MODE O_RDONLY buf[

(mkfifo(FIFO, ) == -((fifofd = open(FIFO, OPEN_MODE)) < (
<stdio.h><stdlib.h><errno.h><unistd.h><fcntl.h><sys/types.h><sys/stat.h>

 FIFO     "/home/zhu/network/fifo/myfifo"
 OPEN_MODE    O_WRONLY
 s[] = ((fifofd = open(FIFO, OPEN_MODE)) < (

编译成功后,我们首先运行服务器(创建FIFO,等待客户发来消息,此时FIFO服务器阻塞):

<sys/msg.h><sys/ipc.h><stdio.h><stdlib.h><errno.h><fcntl.h><unistd.h><sys/types.h><sys/stat.h> msqpath "/home/zhu/network/msgqueue/msq" proj_id 'b' mtext[= ((key = ftok(msqpath, proj_id)) < ((msqid = msgget(key, IPC_CREAT)) < (msgsnd(msqid, &msg1, (msg1), IPC_NOWAIT) < (msgctl(msqid, IPC_STAT, &buf) < (

<sys/msg.h><sys/ipc.h><stdio.h><stdlib.h><errno.h><fcntl.h><unistd.h><sys/types.h><sys/stat.h>

 msqpath    "/home/zhu/network/msgqueue/msq"
 proj_id    'b'

 mtext[((key = ftok(msqpath, proj_id)) < ((msqid = msgget(key, IPC_EXCL)) < (msgrcv(msqid, &msg1, (msg1), , IPC_NOWAIT) < (msgctl(msqid, IPC_STAT, &buf) < (

编译后运行结果如下:

<linux/sem.h><linux/ipc.h><sys/stat.h><fcntl.h><stdio.h><stdlib.h><errno.h><unistd.h> sempath "/home/zhu/network/semaphore/sem" proj_id 'c' = ((key = ftok(sempath, proj_id)) < ((semid = semget(key, , IPC_CREAT)) < sembuf sops = {, -(i = ; i < ; i++

(semop(semid, &sops, ) < 
(

编译运行结果如下(因为我们把信号量值设置为3,所以第四次资源请求失败):

<sys/types.h><sys/ipc.h><sys/shm.h><.h> msg[] = i, *shms, *= ftok(, = shmget(key, , IPC_CREAT | =( pid > = ( *)shmat(shmid, , + (pid == = ( *)shmat(shmid, , (

运行结果:

image

六、信号

信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。

关于信号详细介绍可参考http://www.cnblogs.com/nufangrensheng/p/3514157.html。

相关内容