进程通信

扫码查看

一:实现进程间的管道通信。其中,父进程通过管道向子进程发送一个字符串(子进程的进程号),子进程将它显示出来。

#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( )建立两个子进程serverclientserver进程先建立一个关键字为MSGKEY(75)的消息队列,等待其他进程发来的消息。server进程每接收到一个消息,便显示字符串“Server has received message from Client!”。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出serverclient进程则使用关键字为MSGKEY的消息队列,先后发送类型从101的消息,然后退出。client进程每发送一条消息,便显示字符串“Client has sent message to Server!”最后一条消息,server进程需要结束的信号。父进程在serverclient均退出后结束。

#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();
    }
}
01-13 09:05
查看更多