进程间通信
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;
}
//-------------------------------------------------------------------------