linux应用之----进程通信

来源:互联网 发布:3个月能学会php吗 编辑:程序博客网 时间:2024/05/19 17:08

进程间通信基础

进程间通信的英文缩写: IPC 

为什么需要进程间通信?数据传输,资源共享,通知事件,进程控制等。

Linux进程间通信方式(6种):管道,信号,消息队列,共享内存,信号量,套接字。

各种进程间通信方式详解

    1 :管道通信

                int pipe (int name[2])

    1):成功返回0;失败返回-1;

    2):用于父进程与子进程之间的通信。执行了该函数后,相当于打开了两个文件,一个文件描述符为name[0],另一个为name[1];若要往该管道中写入数据,应该关闭name[0];往name[1]中写数据;要从管道读取数据,关闭name[1];从name[0]中读取即可

    

2 有名管道函数

                int  mkfifo (const char *path, mode_t mode)

1):表头文件 sys/types.h; sys/stat.h。

2):mode模式。同文件的创建模式。

3):若成功则返回0,否则返回-1。

3 :信号通信

简介:信号通信是unix系统最为古老的通信方式。能产生信号的方法有硬件和

软件两种。硬件诸如:按键,除数为0,访问无效存储空间等。软件产生的信号主要是通过命令或函数。

软件产生信号的方法,最重要的是kill函数和kill命令。另外还有raise函数,alarm函数。

信号的种类非常繁多,并且都是以宏定义的形式呈现,都是一些整形常量。常见的信号:SIGKILL(该信号结束接收该信号的进程),SIGINT(来自键盘的中断信号ctrl+c),SIGSTOP(来自键盘ctrl+z或者调试程序的停止执行信号)。

kill函数:  int kill(pid_t pid , int signo)。

raise函数   int raise(int signo)。

Alarm函数   int alarm(unsigned int seconds)。该函数在设定时间后,产生一个SIGALARM信号,如果不捕捉该信号,则默认动作是终止该进程。

pause函数。 Int pause(void)。该函数使调用进程挂起,直至捕捉到一个信号。

信号的处理。调用函数signal。原型不容易理解,直接给出一个例子:

signal(SIGINT, my_func); 此处的myfunc函数时自己定义的一个处理SIGINT信号函数。

4:消息队列通信

简介:unix古老的两种通信方式信号通信和管道通信都有其缺陷。信号通信传输

的信息量有限,而管道通信则只能传送无格式的字节流。消息队列则则克服了上面的缺陷。

头文件:#include <sys/types.h>

       #include <sys/ipc.h>

  应用举例:首先定义一个数据结构,第一个成员必须是整形,或者长整形。它的作用是把信息做一个标识。写进去的信息如果是用100表示,那么读的时候也必须带上参数100,才能从消息队列中读出这条信息。

struct msg_buf

    {

       int mtype;

       char data[255];

};

key_t ftok(char *pathname , char pro); pro只要不为0即可

msgid=msgget(key,IPC_CREAT|0666);

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),mtype值,IPC_NOWAIT)

5:信号量

简介:与其它的通信方式不同,信号量主要是用于保护临界资源。进程可以根据它判定是否能够访问某些共享资源。

分类:二值信号灯和计数信号灯。

6:共享内存

产生共享内存:      shm_id=shmget(键值, 大小,读写权限) ;    为了防止输入的具体键值可能已经被占用,可以使用宏IPC_PRIVATE。来重新新建一块共享内存,它会自动使用新的键值。键值通常用IPC_PRIVATE. 读写权限用S_IRUSR|S_IWUSR

映射共享内存: 一个具体的例子:

                    c_addr = shmat(shmid,0,0);

其中shmid是由shmget得到的,第二个0,表示映射到应用程序的共享内存的起始位置。第三个参数不是很明白。