进程间通信(有名管道)
main函数
进程1代码
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
umask(0);
if(mkfifo("./myfifo",0775)<0)
{
printf("errno=%d\n",errno);
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
if(mkfifo("./yourfifo",0775)<0)
{
printf("errno=%d\n",errno);
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo seccess\n");
int fd=open("./myfifo",O_RDONLY);
if(fd<0)
{
perror("open");
return -1;
}
printf("open success\n");
int fp=open("./yourfifo",O_WRONLY);
if(fp<0)
{
perror("open");
return -1;
}
printf("open success\n");
char buf[128]="";
char str[128]="";
ssize_t res=0;
while(1)
{
bzero(str,sizeof(str));
printf("printf>>>");
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]=0;
if(write(fp,str,sizeof(str))<0)
{
perror("write");
return -1;
}
printf("write success\n");
bzero(buf,sizeof(buf));
res=read(fd,buf,sizeof(buf));
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("exit\n");
break;
}
printf("read success:%s\n",buf);
}
close(fd);
close(fp);
return 0;
}
进程2代码
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
int main()
{
umask(0);
if(mkfifo("./myfifo",0775)<0)
{
printf("errno=%d\n",errno);
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
if(mkfifo("./yourfifo",0775)<0)
{
printf("errno=%d\n",errno);
if(errno!=17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfifo seccess\n");
int fd=open("./myfifo",O_WRONLY);
if(fd<0)
{
perror("open");
return -1;
}
printf("open success\n");
int fp=open("./yourfifo",O_RDONLY);
if(fp<0)
{
perror("open");
return -1;
}
printf("open success\n");
char str[128]="";
char buf[128]="";
ssize_t res=0;
while(1)
{
bzero(buf,sizeof(buf));
res=read(fp,buf,sizeof(buf));
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("exit\n");
break;
}
printf("read success:%s\n",buf);
bzero(str,sizeof(str));
printf("printf>>>");
fgets(str,sizeof(str),stdin);
str[strlen(str)-1]=0;
if(write(fd,str,sizeof(str))<0)
{
perror("write");
return -1;
}
printf("write success\n");
}
close(fd);
close(fp);
return 0;
}
实验结果
进程1
进程2
信号的获取
main函数
捕获硬件可捕捉的信号2,3,20
2) SIGINT 默认处理函数:退出进程 ctrl + c
3) SIGQUIT 默认处理函数:退出进程 ctrl + \
20) SIGTSTP 默认处理函数:挂起进程 ctrl + z
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
typedef void (*sighandler_t)(int);
void handler_old2(int sig)
{
printf("this is signal old_2\n");
}
void handler_new2(int sig)
{
printf("this is signal new_2\n");
}
void handler_old3(int sig)
{
printf("this is signal old_3\n");
}
void handler_new3(int sig)
{
printf("this is signal new_3\n");
}
void handler_old20(int sig)
{
printf("this is signal old_20\n");
}
void handler_new20(int sig)
{
printf("this is signal new_20\n");
}
int main()
{
printf("signal_old2:%p\nsignal_new2:%p\n",handler_old2,handler_new2);
printf("signal_old3:%p\nsignal_new3:%p\n",handler_old3,handler_new3);
printf("signal_old20:%p\nsignal_new20:%p\n",handler_old20,handler_new20);
sighandler_t s=signal(2,handler_old2);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
s=signal(2,handler_new2);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
s=signal(3,handler_old3);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
s=signal(3,handler_new3);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
s=signal(20,handler_old20);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
s=signal(20,handler_new20);
if(SIG_ERR == s)
{
perror("signal");
return -1;
}
printf("pre signal:%p\n",s);
while(1)
{
printf("this is main\n");
sleep(2);
}
return 0;
}
实验结果
(尽量不要把信号都重置,不然退出只能关闭终端)