4.3 进程的秘密(进程间的通信)

进程间通信
    1,无名管道pipe,半双工通信;只能用在有亲缘关系的进程之间通信;使用pipe创建,使用read(),write()进行读写操作;创建pipe管道会创建两个文件描述符fd[0]和fd[1];fd[0]用来读,fd[1]用来写;
    2,有名管道fifo,可以在不相干的两个进程之间通信,先进先出;使用mkfifo()创建;文件在文件系统中可见.使用时需要先打开写,后打开读;
    3,信号通信.它类似于一个中断,可以在任何时刻到达;

函数:
    pipe():
        //头文件  <unistd.h>
        //创建无名管道,有两个参数,一个读,一个写
    mkfifo()
    unlink():
        //头文件  <sys/types.h> <sys/stat.h>
        //mk创建,参数包括路径文件名,文件权限.mkfifo如果创建失败,可以确认下目录文件是不是已经存在.
        //un删除,参数为路径文件名.
    open():
        //头文件 <fcntl.h>  <sys/types.h> <sys/stat.h>
        //打开有名管道FIFO创建的文件.
    信号说明:
        //SIGSTOP 用于暂停一个进程;不能被阻塞,处理或忽略
        //SIGKILL 立刻结束程序
        //SIGCONT 将一个暂停的进程继续运行;
        //SIGALRM 定时器信号,定时器结束时,向进程发送一个SIGALRM;
    kill()
    raise():
        //头文件 <sys/types.h> <signal.h>
        //kill可以通过pid发送信号到别的进程;
        //raise 发送信号到自己的进程;
    alarm()
    pause():
        //头文件为 <unistd.h>
        //alarm 闹钟函数,进程在经过闹钟设定的时间后打印Alarm clock后结束进程
        //pause 进程进入挂起状态,直到一个信号达到.

设计五个简单例程:

         1. 无名管道pipe通信           
         2. 有名管道fifo写             
         3. 有名管道fifo读             
         4. 信号使用之kill,raise函数   
         5. 信号的使用之定时器,pause   

设计代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <wait.h>

int process_exp1();
int process_exp2();
int process_exp3();
int process_exp4();
int process_exp5();

//*************************exp5********************************************
int process_exp5()
{
	pid_t fork_pid;
	
	printf("new:start\n");
	alarm(5);
	printf("new: pid=%d\n",getpid());
	sleep(1);
	pause();
	return 0;
}
//------------------------------------------------------------------------

//*************************exp4********************************************
int process_exp4()
{
	pid_t fork_pid;
	
	fork_pid=fork();
	if(fork_pid<0)
	{
		printf("create process failed!!\n");
	}
	else if(fork_pid==0)
	{
		//sleep(1);
		printf("new:getpid=%d\n",getpid());
		printf("new:getppid=%d\n",getppid());
		raise(SIGSTOP);
		printf("new:???\n");
		exit(0);
	}	
	else
	{
		sleep(1);		
		//kill(fork_pid,SIGKILL);	
		kill(fork_pid,SIGCONT);
		printf("old:PID=%d process close\n",fork_pid);

	}

	return 0;
}
//-------------------------------------------------------------------------

//*************************exp3********************************************
int process_exp3()
{
	int   fd;
	char  str[99];
	int   str_len=0;
	int   i=0;
	
	fd=open("exp2_test.txt",O_RDONLY);
	printf("fd=%d\n",fd);
	while(1)
	{
		memset(str,0,99);
		read(fd,str,99);
		str_len=strlen(str);
		if(str_len>0)
			printf("str_len=%d,data :%s ",str_len,str);
		else 
			break;
	}
	close(fd);
	unlink("exp2_test.txt");
	return 0;
}

//*************************exp2********************************************
int process_exp2()
{
	int   fd;
	char  str[99];
	int   str_len=0;
	int   i=0;
	int   mk_status=0;

	mk_status=mkfifo("exp2_test.txt",0777);
	if(mk_status==-1)
	{
		printf("mkfifo failed!!\n");
	}
	
	fd=open("exp2_test.txt",O_WRONLY);
	printf("fd=%d\n",fd);
	while(1)
	{
		memset(str,0,99);
		printf("input char:");
		fgets(str,99,stdin);
		str_len=strlen(str);
		write(fd,str,str_len+1);
	//	sleep(1);
	}
	close(fd);
	return 0;
}
//-------------------------------------------------------------------------


//*************************exp1********************************************
int process_exp1()
{
	int fd[2];
	char buff[]={"hello adsadfasfasfa!!!"};
	int buff_len=0;
	pid_t fork_pid;

	if(pipe(fd)==-1)
	{
		printf("create pipe failed!!\n");
	}

	fork_pid=fork();
	if(fork_pid<0)
	{
		printf("create process failed!!\n");
	}
	else if(fork_pid==0)
	{
		close(fd[0]);
		printf("input char data : \n");
		fgets(buff,99,stdin);
		buff_len=strlen(buff);
		write(fd[1],buff,buff_len);
		close(fd[1]);		
		exit(0);
	}
	else 
	{	close(fd[1]);
		sleep(1);
		read(fd[0],buff,99);
		buff_len=strlen(buff);
		printf("buff_len=%d,read data: %s",buff_len,buff);
	}

	return 0;
}
//-------------------------------------------------------------------------


//**************************main*****************************************
int main()
{
	int n=0;

	printf("<_>*******************exp process***********************<_>\n");
	printf("1.无名管道pipe通信                                        *\n");
	printf("2.有名管道fifo写                                          *\n");
	printf("3.有名管道fifo读                                          *\n");
	printf("4.信号使用之kill,raise函数                                *\n");
	printf("5.信号的使用之定时器,pause                                *\n");
	printf("<_>-----------------------------------------------------<_>\n");
	
	printf("please select exp number: \n");
	scanf("%d",&n);	
	do
	{
	}while(getchar()!='\n');			

	switch(n)
	{
		case 0 : break;
		case 1 : process_exp1(); break;
		case 2 : process_exp2(); break;
		case 3 : process_exp3(); break;
		case 4 : process_exp4(); break;
		case 5 : process_exp5(); break;
		default : 
				 printf("input error!!! restart!\n");
				 break; 
	}

	printf("run finish !!!! *bye bye!!!\n");
	exit(0);
	return 0;
}
//-------------------------------------------------------------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值