一 、进程通信通过管道进行实现;
(1)管道是什么,管道是一种单向的,先进先出的一种通道;
(2)管道分为有名管道和无名管道;无名管道是只能在父进程与子进程之间进行通信的一种通道‘
(3)有名管道可以在俩个不是父进程与子进程之间的进程之间进行通信;大多数情况我们可以选择
有名通道的创建进行进程之间的通信,但是局限于同一台操作机器;同时在此处我们还拓展一种利用管道而产生的文件重定向;
以下是文件重定向的内容:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
close(1);
int fd = open ("test.txt", O_RDWR|O_CREAT);
if (fd == -1)
{
perror ("open");
}
//while (1)
{
//sleep(1);
printf ("hello\n");
}
return 0;
}
将标准输出关闭直接写入到文件中!
2、popen函数
(1) 头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
(2)定义的格式:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
3、pipe函数用于创建管道
(1)头文件
#include
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
// 创建命名管道
int fd = mkfifo("/home/myfifo", S_IRUSR|S_IWUSR); // mkfifo是创建时候时候使用的函数
if (fd == -1)
{
perror ("mkfifo");
}
return 0;
}
二、共享内存的创建
(1)首先要定义头文件格式,各种头文件都不可或缺
在头文件中定义一个结构体,在结构体中定义变量id和char型数组msg用来写入变量
#ifndef __SHM_H__
#define __SHM_H__
typedef struct _shm
{
int id;
char msg[1024];
}SHM;
#endif // __SHM_H__
(2)
· a、在共享内存的创建主函数中先使用创建的函数shmgeta(),进行共享内存的创建
格式如下: int fd = shmget((key_t)1234, sizeof(SHM), 666 | IPC_CREAT);
红色部分是固定的可以直接定义666,或者俩个放在一起,不过通常都是放在一起定义的;
b、创建完成后进行共享内存的映射,将其映射到你要应用的进程中去!
格式如下:
SHM * pshm = (SHM*)shmat(fd, NULL, 0); // 定义的类型是结构体的变量类型,使用类 似于函数malloc()的使用;
if (pshm == (void*)-1)
{
perror (“shmat”);
return -1;
}
c、将数据写入 strcpy(pshm->msg, “hello”);
d、一切操作结束以后将共享内存删除
int ret = shmctl(fd, IPC_RMID, NULL);
if (ret == -1)
{
perror (“shmctl”);
}
三、使用共享内存进行卖票系统的编写
(1)在头文件中要要定义一个结构体,其中有俩个变量,一个是来表示共享买票标志的
在argc == 2 的时候进行结构体数据的初始化
flag= 1; 标志
ticket = 100;票数
(2)创建的步骤同上一致,只不过在映射空间后进行当前进程对新建的共享内存初始化;
然后调用我们写的卖票系统;
(3)在买票的系统中要注意时间延迟,usleep(rand()%1000000);微秒级别,随机产生延迟时