linux进程间通信(linux进程间通信方式互斥)

      最后更新:2023-05-29 13:58

      如何在linux环境下实现进程之间的通信

      linux环境下实现进程之间的通信主要有以下几种方式: # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存( shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。管道的主要局限性正体现在它的特点上:只支持单向数据流;只能用于具有亲缘关系的进程之间;没有名字;管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小); 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;
      假设A进程和B进程进行通信,则若A进程要告知B进程要B进程调用一个函数,则A必须知道B的pid,pid是pid_t类型的,即A里有pid_t pid = getpid();然后传给A,让A知道B的进程号,作为一个全局变量就行了,其实也没必要传递。(一会说一下怎么做全局变量。)在A要B调用函数的地方,使用kill函数, int kill(pid_t pid,int sig);pid是A的,sig可以随便写一个数字,32以内吧,我一般用SIGUSR1。调用kill之前保证B函数已经执行了signal函数。signal(int signum,void(* handler)(int));handler是一个函数名,他有一个参数int型(就是signum),signum要和kill用的一样。当A执行kill时,B就会执行handler函数。下面讲一下怎么使用全局变量。例如两个文件中要共享一些变量作为全局变量,然后其中一个声明变量名称,另一个如果也声明的话,在编译的时候不会出错,但是在连接的时候就会出错,这是因为变量名重了,但是你在另一个声明之前,加一个extern,写成extern int aa;这是告诉编译器,编译可以通过,在别处已经声明了,不是在这里声明,连接时候也不错,用这种办法就可以多个进程共享很多变量了,更没有必要把变量当参数传来传去,比较麻烦。好了就这些。希望对你有用。另外,忽然发现,0分唉o_o~~能不能加点========================================== 你知道吗,写了这么大一通发现楼主消失了,会不会感到很爽?!!!
      在parent进程中,打印各进程id printf(
      如何在linux环境下实现进程之间的通信

      Linux 进程间通信方式有哪些

      1、无名管道通信 无名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。2、高级管道通信高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们称为高级管道方式。3、有名管道通信有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。4、消息队列通信消息队列(messagequeue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。5、信号量通信信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。6、信号信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。7、共享内存通信共享内存(sharedmemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。8、套接字通信 套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
      进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。1、无名管道通信无名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常是指父子进程关系。2、高级管道通信高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们称为高级管道方式。3、有名管道通信有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。4、消息队列通信消息队列(messagequeue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。5、信号量通信信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。6、信号信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。7、共享内存通信共享内存(sharedmemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。8、套接字通信 套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
      Linux 进程间通信方式有哪些

      linux下c的两个进程如何实现通信?一个进程给另一个进程发送消息,另一个接受并显示出来。求大神啊

      linux中的进程通信分为三个部分:低级通信,管道通信和进程间通信IPC(inter process communication)。linux的低级通信主要用来传递进程的控制信号——文件锁和软中断信号机制。linux的进程间通信IPC有三个部分——①信号量,②共享内存和③消息队列。以下是我编写的linux进程通信的C语言实现代码。操作系统为redhat9.0,编辑器为vi,编译器采用gcc。下面所有实现代码均已经通过测试,运行无误。 一.低级通信--信号通信signal.c#include #include #include /*捕捉到信号sig之后,执行预先预定的动作函数*/void sig_alarm(int sig){printf("---the signal received is %d. /n", sig);signal(SIGINT, SIG_DFL); //SIGINT终端中断信号,SIG_DFL:恢复默认行为,SIN_IGN:忽略信号}int main(){signal(SIGINT, sig_alarm);//捕捉终端中断信号while(1){printf("waiting here!/n");sleep(1);}return 0;}二.管道通信pipe.c#include #define BUFFER_SIZE 30int main(){int x;int fd[2];char buf[BUFFER_SIZE];char s[BUFFER_SIZE];pipe(fd);//创建管道while((x=fork())==-1);//创建管道失败时,进入循环/*进入子进程,子进程向管道中写入一个字符串*/if(x==0){sprintf(buf,"This is an example of pipe!/n");write(fd[1],buf,BUFFER_SIZE);exit(0);}/*进入父进程,父进程从管道的另一端读出刚才写入的字符串*/else{wait(0);//等待子进程结束read(fd[0],s,BUFFER_SIZE);//读出字符串,并将其储存在char s[]中printf("%s",s);//打印字符串}return 0;}三.进程间通信——IPC①信号量通信sem.c#include #include #include #include #include #include /*联合体变量*/union semun{int val; //信号量初始值struct semid_ds *buf;unsigned short int *array;struct seminfo *__buf;};/*函数声明,信号量定义*/static int set_semvalue(void); //设置信号量static void del_semvalue(void);//删除信号量static int semaphore_p(void);//执行P操作static int semaphore_v(void);//执行V操作static int sem_id; //信号量标识符int main(int argc, char *argv[]){int i;int pause_time;char op_char = 'O';srand((unsigned int)getpid());sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT);//创建一个信号量,IPC_CREAT表示创建一个新的信号量/*如果有参数,设置信号量,修改字符*/if (argc > 1){if (!set_semvalue()){fprintf(stderr, "Failed to initialize semaphore/n");exit(EXIT_FAILURE);}op_char = 'X';sleep(5);}for(i = 0; i < 10; i++){/*执行P操作*/if (!semaphore_p())exit(EXIT_FAILURE);printf("%c", op_char);fflush(stdout);pause_time = rand() % 3;sleep(pause_time);printf("%c", op_char);fflush(stdout);/*执行V操作*/if (!semaphore_v())exit(EXIT_FAILURE);pause_time = rand() % 2;sleep(pause_time);}printf("/n%d - finished/n", getpid());if (argc > 1){sleep(10);del_semvalue(); //删除信号量}exit(EXIT_SUCCESS);}/*设置信号量*/static int set_semvalue(void){union semun sem_union;sem_union.val = 1;if (semctl(sem_id, 0, SETVAL, sem_union) == -1)return(0);return(1);}/*删除信号量*/static void del_semvalue(void){union semun sem_union;if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1)fprintf(stderr, "Failed to delete semaphore/n");}/*执行P操作*/static int semaphore_p(void){struct sembuf sem_b;sem_b.sem_num = 0;sem_b.sem_op = -1; /* P() */sem_b.sem_flg = SEM_UNDO;if (semop(sem_id, &sem_b, 1) == -1){fprintf(stderr, "semaphore_p failed/n");return(0);}return(1);}/*执行V操作*/static int semaphore_v(void){struct sembuf sem_b;sem_b.sem_num = 0;sem_b.sem_op = 1; /* V() */sem_b.sem_flg = SEM_UNDO;if (semop(sem_id, &sem_b, 1) == -1){fprintf(stderr, "semaphore_v failed/n");return(0);}return(1);}②消息队列通信send.c#include #include #include #include #include #include #include #include #define MAX_TEXT 512/*用于消息收发的结构体--my_msg_type:消息类型,some_text:消息正文*/struct my_msg_st{long int my_msg_type;char some_text[MAX_TEXT];};int main(){int running = 1;//程序运行标识符struct my_msg_st some_data;int msgid;//消息队列标识符char buffer[BUFSIZ];/*创建与接受者相同的消息队列*/msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if (msgid == -1){fprintf(stderr, "msgget failed with error: %d/n", errno);exit(EXIT_FAILURE);}/*向消息队列中发送消息*/while(running){printf("Enter some text: ");fgets(buffer, BUFSIZ, stdin);some_data.my_msg_type = 1;strcpy(some_data.some_text, buffer);if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1){fprintf(stderr, "msgsnd failed/n");exit(EXIT_FAILURE);}if (strncmp(buffer, "end", 3) == 0){running = 0;}}exit(EXIT_SUCCESS);}receive.c#include #include #include #include #include #include #include #include /*用于消息收发的结构体--my_msg_type:消息类型,some_text:消息正文*/struct my_msg_st{long int my_msg_type;char some_text[BUFSIZ];};int main(){int running = 1;//程序运行标识符int msgid; //消息队列标识符struct my_msg_st some_data;long int msg_to_receive = 0;//接收消息的类型--0表示msgid队列上的第一个消息/*创建消息队列*/msgid = msgget((key_t)1234, 0666 | IPC_CREAT);if (msgid == -1){fprintf(stderr, "msgget failed with error: %d/n", errno);exit(EXIT_FAILURE);}/*接收消息*/while(running){if (msgrcv(msgid, (void *)&some_data, BUFSIZ,msg_to_receive, 0) == -1){fprintf(stderr, "msgrcv failed with error: %d/n", errno);exit(EXIT_FAILURE);}printf("You wrote: %s", some_data.some_text);if (strncmp(some_data.some_text, "end", 3) == 0){running = 0;}}/*删除消息队列*/if (msgctl(msgid, IPC_RMID, 0) == -1){fprintf(stderr, "msgctl(IPC_RMID) failed/n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}③共享内存通信share.h#define TEXT_SZ 2048 //申请共享内存大小struct shared_use_st{int written_by_you; //written_by_you为1时表示有数据写入,为0时表示数据已经被消费者提走char some_text[TEXT_SZ];};producer.c#include #include #include #include #include #include #include #include "share.h"int main(){int running = 1; //程序运行标志位void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;char buffer[BUFSIZ];int shmid; //共享内存标识符/*创建共享内存*/shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1){fprintf(stderr, "shmget failed/n");exit(EXIT_FAILURE);}/*将共享内存连接到一个进程的地址空间中*/shared_memory = shmat(shmid, (void *)0, 0);//指向共享内存第一个字节的指针if (shared_memory == (void *)-1){fprintf(stderr, "shmat failed/n");exit(EXIT_FAILURE);}printf("Memory attached at %X/n", (int)shared_memory);shared_stuff = (struct shared_use_st *)shared_memory;/*生产者写入数据*/while(running){while(shared_stuff->written_by_you == 1){sleep(1);printf("waiting for client.../n");}printf("Enter some text: ");fgets(buffer, BUFSIZ, stdin);strncpy(shared_stuff->some_text, buffer, TEXT_SZ);shared_stuff->written_by_you = 1;if (strncmp(buffer, "end", 3) == 0){running = 0;}}/*该函数用来将共享内存从当前进程中分离,仅使得当前进程不再能使用该共享内存*/if (shmdt(shared_memory) == -1){fprintf(stderr, "shmdt failed/n");exit(EXIT_FAILURE);}printf("producer exit./n");exit(EXIT_SUCCESS);}customer.c#include #include #include #include #include #include #include #include "share.h"int main(){int running = 1;//程序运行标志位void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;int shmid; //共享内存标识符srand((unsigned int)getpid());/*创建共享内存*/shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1){fprintf(stderr, "shmget failed/n");exit(EXIT_FAILURE);}/*将共享内存连接到一个进程的地址空间中*/shared_memory = shmat(shmid, (void *)0, 0);//指向共享内存第一个字节的指针if (shared_memory == (void *)-1){fprintf(stderr, "shmat failed/n");exit(EXIT_FAILURE);}printf("Memory attached at %X/n", (int)shared_memory);shared_stuff = (struct shared_use_st *)shared_memory;shared_stuff->written_by_you = 0;/*消费者读取数据*/while(running){if (shared_stuff->written_by_you){printf("You wrote: %s", shared_stuff->some_text);sleep( rand() % 4 );shared_stuff->written_by_you = 0;if (strncmp(shared_stuff->some_text, "end", 3) == 0){running = 0;}}}/*该函数用来将共享内存从当前进程中分离,仅使得当前进程不再能使用该共享内存*/if (shmdt(shared_memory) == -1){fprintf(stderr, "shmdt failed/n");exit(EXIT_FAILURE);}/*将共享内存删除,所有进程均不能再访问该共享内存*/if (shmctl(shmid, IPC_RMID, 0) == -1){fprintf(stderr, "shmctl(IPC_RMID) failed/n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);}摘自:http://blog.csdn.net/piaojun_pj/article/details/5943736
      linux下c的两个进程如何实现通信?一个进程给另一个进程发送消息,另一个接受并显示出来。求大神啊

      linux内核与用户进程通信的方法具体有哪几种

      # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
      这个是进程间的吧。
      linux内核与用户进程通信的方法具体有哪几种

      列举linux进程间通信方式,linux pthread线程同步的方式有哪些

      进程间通讯进程间通信就是不同进程之间传播或交换信息,进程的用户空间是互相独立的,进程之间可以利用系统空间交换信息。 管道(pipe)管道是一种半双工的通信方式,数据只能单向流动。如果要进行双工通信,需要建立两个管道。 管道只能在具有亲...
      列举linux进程间通信方式,linux pthread线程同步的方式有哪些

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类