进程之间的通信,管道,套接字,共享内存,信号,信号量等。
套接字适用范围很广,用于两个主机之间的两个进程的通信,一台主机的两个进程也可以进行通信,例如数据库,与数据库建立连接通信就是和数据库进行socket通信。
信号,如kill向进程发送信号,在linux下向进程发松9号信号用于杀死进程kill -9 pid
信号量,用于控制进程的同步,使得整个进程间前向推进
共享内存,共享的是物理内存,两个进程通过地址映射,映射到相同的一块地址空间。
管道分为有名管道和无名管道,有名管道类似于建立一个文件使得任意两进程之间可以进行通信。而无名管道的生存依赖与进程的生命周期,无名管道的适用面小于有名管道,只适用与有亲缘关系的进程,比如通过fork()函数产生的进程,父进程子进程等等
通过有名管道两个进程之间相互通信
读取管道中信息的进程:
int main()
{
int fr = open("./pipefile", O_RDONLY);//在建立的管道中读取数据,打开方式类似于文件,以只读方式打开
assert(fr != -1);
char buf[128] = {0};
while(1)
{
int num = read(fr, buf, 128);
if (num == 0 || !(strncmp(buf, "exit", 4)))
{
exit(0);
}
printf("%s", buf);
memset(buf, 0, 128);
}
return 0;
}
为管道发送信息的进程:
int main()
{
int fdw = open("./pipefile", O_WRONLY);
assert(fdw != NULL);
char buf[128] = {0};
while(1)
{
fgets(buf, 128, stdin);//从标准输入读取数据
int n = write(fdw, buf, 128);//将数据写到有名管道中
buf[strlen(buf)-1] = 0;
if (!(strcmp(buf, "exit")))
{
printf("jieshu");
exit(0);
}
memset(buf,0,128);
}
return 0;
}
在Linux下,建立管道的命令:mkfifo 管道名,还有建立管道的函数mkfifo可提供程序建立管道
无名管道用于进程间的通信:
int main()
{
int fd[2];
assert(pipe(fd) != -1);//无名管道的创建,获得两个整形变量,fd[0]用来向管道中读数据,fd[1]向管道中写入数据
pid_t pid = fork();
assert( pid != -1);
if (pid == 0) //子进程从其中读数据
{
close(fd[1]);//屏蔽掉了写入操作
char buff[128] = {0};
read(fd[0], buff, 127);
printf("the child is %s\n", buff);
close(fd[0]);
}
else//父进程从其中写数据
{
close(fd[0]);//屏蔽掉了读入操作
printf("input: ");
char buff[128] = {0};
fgets(buff, 127, stdin);
write(fd[1], buff, strlen(buff));
close(fd[1]);
}
exit(0);
}