一:实现进程间的管道通信。其中,父进程通过管道向子进程发送一个字符串(子进程的进程号),子进程将它显示出来。
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #define MAXLINE 100 int main( void ) { int fd[2]; pid_t pid; char line[MAXLINE]; int n; if(pipe( fd ) < 0 ) printf( "pipe error!\n" ); if((pid = fork()) < 0 ) { printf( "fork error!\n" ); } else if( pid > 0 ) { close( fd[0] ); write( fd[1], "hello world\n", 12 ); } else { close( fd[1] ); n = read( fd[0], line, 12 ); write( STDOUT_FILENO, line, n ); } exit( 0 ); }
二:编写一段程序,使用消息缓冲队列来实现client进程和server进程之间的通信。消息的创建、发送和接收。 先使用fork( )建立两个子进程server和client。server进程先建立一个关键字为MSGKEY(如75)的消息队列,等待其他进程发来的消息。server进程每接收到一个消息,便显示字符串“Server has received message from Client!”。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出server。client进程则使用关键字为MSGKEY的消息队列,先后发送类型从10到1的消息,然后退出。client进程每发送一条消息,便显示字符串“Client has sent message to Server!”。最后一条消息,是server进程需要结束的信号。父进程在server和client均退出后结束。
#include<stdio.h>//IO #include<sys/types.h>//msgget用 #include<sys/msg.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/wait.h>//wait()&waitpid() #include<stdlib.h>//exit()用 #include <unistd.h>//fork()用/进程标识符 #define SHMKEY 75/*定义共享区关键词*/ void CLIENT() { int shmid,i; int *addr; shmid = shmget(SHMKEY,1024, 0777|IPC_CREAT);//获取共享区,长度1024,关键词SHMKEY addr = shmat(shmid,0,0);//挂接操作:共享区起始地址为addr for (i = 9; i >=0; i--) { while(*addr!= -1); printf("CLIENT %d has sent message to Server!\n",i+1); *addr = i; } exit(0); } void SERVER() { int shmid; int *addr; shmid = shmget(SHMKEY,1024, 0777|IPC_CREAT);/*创建共享区*/ addr = shmat(shmid,0,0); /*共享区起始地址为addr*/ *addr=-1; do { while(*addr == -1); printf("SERVER has received messase from Client %d\n",(*addr)+1); if(*addr != 0) *addr = -1; }while(*addr != 0); wait(0); shmctl(shmid,IPC_RMID,0);//操作共享内存,成功返回0,出错返回-1 } void main() { if(fork()) { SERVER(); }else { CLIENT(); } }