国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison développement back-end tutoriel php Linux -- communication inter-processus -- file d'attente de messages

Linux -- communication inter-processus -- file d'attente de messages

Jan 18, 2017 am 10:43 AM

一、消息隊(duì)列的定義?
消息隊(duì)列能夠彌補(bǔ)管道的不足,實(shí)現(xiàn)雙向交互數(shù)據(jù),是一個(gè)進(jìn)程向另一進(jìn)程發(fā)送進(jìn)程塊的方法。與管道不同的是,管道是基于字節(jié)流的,消息隊(duì)列是基于消息的,且消息隊(duì)列的讀取不一定是先進(jìn)先出。

二、消息隊(duì)列的創(chuàng)建
通過函數(shù)int messget(key_t key,int msgflg);創(chuàng)建

key:端口號(hào),可以有 ftok生成。
msgflg:
IPC_CRTAT 若果 IPC不存在,則創(chuàng)建一個(gè)IPC資源,
IPC_EXCL:一般和 IPC_CREAT一起使用可以保證所得的對(duì)象是新建的,而不是打開已有的。
三、向消息隊(duì)列讀數(shù)據(jù)
msgrcv從隊(duì)列中取的消息

ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg);

msgsnd將消息放進(jìn)隊(duì)列中

int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

四、設(shè)置消息隊(duì)列屬性
int msgctl(int msgqid,int cmd,struct msqid_ds *buf);

*** 可以用man 函數(shù)名 查看函數(shù)***

程序代碼:

coom.h

1 #pragma once  
  2 #include<stdio.h>  
  3 #include<stdlib.h>  
  4 #include<string.h>  
  5 #include<sys/types.h>  
  6 #include<sys/ipc.h>  
  7 #include<sys/msg.h>  
    
  8 #define _PATH_ "."  
  9 #define _PROCID_ 0x776  
 10 #define _SIZE 1024  
 11 #define SERVE_MSGTYPE 1  
 12 #define CLIECT_MSGTYPE 2  
   
 13 typedef struct message  
 14 {  
 15   long mtype;  
 16   char mtext[_SIZE];  
 17 }message;  
 18 int create_msg(int msg_num);  
 19 int drstroy_msg(int msg_id);  
 20 int set_msg();  
 21 int get_msg();  
 22 int msg_send(int msg_id,const char* msg,long type);  
 23 int msg_rec(int msg_id ,char buf[],long type);

comm .c

1 #include"comm.h"  
  2  int create_msg(int msg_num)  
  3 {  
  4   key_t _key=ftok(_PATH_,_PROCID_);  
  5   if(_key < 0)  
  6   {  
  7     perror("ftok");  
  8     return -1;  
  9   }  
 10   int ret= msgget(_key,msg_num);  
 11    if(ret < 0)  
 12    {  
 13     perror("msgget");  
 14     return -1;  
 15    }  
 16  return ret;  
 17 }  
 18 int drstroy_msg(int msg_id)  
 19 {  
 20   if(msgctl(msg_id,IPC_RMID,NULL) < 0)  
 21   {  
 22     perror("msgctl");  
 23     return -1;  
 24   }else{  
 25     printf("remove message_queue\n");  
 26     return 0;  
 27   }  
 28 }  
 29 int set_msg()  
 30 {  
 31   umask(0);  
 32   return create_msg(IPC_CREAT |IPC_EXCL |0666);  
 33 }  
 34 int get_msg()  
 35 {  
 36     return create_msg(IPC_CREAT);  
 37 }  
 38 int msg_send(int msg_id,const char* msg,long type)  
 39 {  
 40   struct message _msg;  
 41   _msg.mtype=type;  
 42   strcpy(_msg.mtext,msg);  
 43   if(msgsnd(msg_id,&_msg,strlen(_msg.mtext),0)< 0)  
 44   {  
 45     perror("msg_send error");  
 46     return -1;  
 47   }  
 48   return 0;  
 49 }  
 50 int msg_rec(int msg_id,char buf[],long type)  
 51 {  
 52   struct message _msg;  
 53   memset(_msg.mtext,&#39;\0&#39;,_SIZE);  
 54   if(msgrcv(msg_id,&_msg,_SIZE,type,0)< 0)  
 55   {  
 56     perror("msg_receve error");  
 57     return -1;  
 58   }  
 59   strcpy(buf,_msg.mtext);  
 60   return 0;  
 61 }  
 62

client.c

1 #include"comm.h"  
  2 int main()  
  3 {  
  4  int msg_id=get_msg();  
  5  if(msg_id<0)  
  6  {  
  7   perror("error");  
  8   exit(1);  
  9  }  
 10   char buf[_SIZE];  
 11  while(1)  
 12  {  
 13   fflush(stdout);  
 14   printf("please client input: ");  
 15   memset(buf,&#39;\0&#39;,_SIZE);  
 16   fgets (buf,sizeof(buf),stdin);  
 17   if(msg_send(msg_id,buf,CLIECT_MSGTYPE)< 0)  
 18     {  
 19       perror("send fail");  
 20       exit(1);  
 21     }  
 22   
 23   if(msg_rec(msg_id,buf,SERVE_MSGTYPE)<0)  
 24     {  
 25       perror("recve fail");  
 26       exit(1);  
 27     }  
 28   printf("serve:%s" ,buf);  
 29  }  
 30   return 0;  
 31 }

server.c

1 #include "comm.h"  
  2 int main()  
  3 {  
  4   int msg_id=set_msg();  
  5   if(msg_id<0)  
  6   {  
  7     perror("mig_id");  
  8     exit(1);  
  9   }  
 10   printf("%d\n",msg_id);  
 11   char buf[_SIZE];  
 12   while(1)  
 13   {  
 14      if(msg_rec(msg_id,buf,CLIECT_MSGTYPE)< 0)  
 15     {  
 16       perror("recve fail");  
 17       exit(1);  
 18     }  
 19     else  
 20     {  
 21       printf("client :%s",buf);  
 22     }  
 23     printf("server please input: ");  
 24     fflush(stdout);  
 25     memset(buf,&#39;\0&#39;,_SIZE);  
 26     fgets(buf,_SIZE,stdin);  
 27     if(msg_send(msg_id,buf,SERVE_MSGTYPE)<0)  
 28     {  
 29       perror("send fail");  
 30       exit(1);  
 31     }  
 32   }  
 33   drstroy_msg(msg_id);  
 34   return 0;  
 35 }

運(yùn)行結(jié)果:

Linux -- communication inter-processus -- file dattente de messages

以上就是Linux --進(jìn)程間通信--消息隊(duì)列的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.miracleart.cn)!


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Comment installer Linux aux c?tés de Windows (double démarrage)? Comment installer Linux aux c?tés de Windows (double démarrage)? Jun 18, 2025 am 12:19 AM

La clé de l'installation de deux systèmes dans Linux et Windows est le partitionnement et les paramètres de démarrage. 1. La préparation comprend la sauvegarde des données et la compression des partitions existantes pour faire de la place; 2. Utilisez Ventoy ou Rufus pour créer un disque USB Linux Boot, recommandez Ubuntu; 3. Sélectionnez "coexister avec d'autres systèmes" ou partition manuellement pendant l'installation (/ au moins 20 Go, / l'espace restant à domicile, échange facultatif); 4. Vérifiez l'installation de pilotes tiers pour éviter les problèmes matériels; 5. Si vous n'entrez pas dans le menu de démarrage GRUB après l'installation, vous pouvez utiliser la réparation de démarrage pour réparer le démarrage ou ajuster la séquence de démarrage du BIOS. Tant que les étapes sont claires et que l'opération est effectuée correctement, l'ensemble du processus n'est pas compliqué.

Comment choisir une distribution Linux pour un débutant? Comment choisir une distribution Linux pour un débutant? Jun 19, 2025 am 12:09 AM

Les utilisateurs des débutants doivent d'abord clarifier leurs exigences d'utilisation lors du choix d'une distribution Linux. 1. Choisissez Ubuntu ou Linuxmint pour une utilisation quotidienne; La programmation et le développement conviennent à Manjaro ou Fedora; Utilisez Lubuntu et d'autres systèmes légers pour les anciens appareils; Recommander CentosStream ou Debian pour apprendre les principes sous-jacents. 2. La stabilité est préférée pour Ubuntults ou Debian; Vous pouvez choisir Arch ou Manjaro pour poursuivre de nouvelles fonctionnalités. 3. En termes de soutien communautaire, Ubuntu et Linuxmint sont riches en ressources et les documents d'arc sont orientés techniquement. 4. En termes de difficulté d'installation, Ubuntu et Linuxmint sont relativement simples et Arch convient à ceux qui ont des besoins de base. Il est recommandé de l'essayer d'abord, puis de décider.

Comment ajouter un nouveau disque à Linux Comment ajouter un nouveau disque à Linux Jun 27, 2025 am 12:15 AM

Les étapes pour ajouter un nouveau disque dur au système Linux sont les suivantes: 1. Confirmez que le disque dur est reconnu et utilisez LSBLK ou FDISK-L pour vérifier; 2. Utilisez des partitions FDISK ou séparées, telles que FDISK / DEV / SDB et créer et enregistrer; 3. Format la partition sur un système de fichiers, tel que mkfs.ext4 / dev / sdb1; 4. Utilisez la commande Mount pour des supports temporaires, tels que le mont / dev / sdb1 / mnt / data; 5. Modifier / etc / fstab pour atteindre un montage automatique sur l'ordinateur et tester d'abord le support pour assurer l'exactitude. Assurez-vous de confirmer la sécurité des données avant le fonctionnement pour éviter les problèmes de connexion matérielle.

Correction de l'échec de téléchargement de fichiers dans Windows Google Chrome Correction de l'échec de téléchargement de fichiers dans Windows Google Chrome Jul 08, 2025 pm 02:33 PM

Vous avez des problèmes de téléchargement de fichiers dans Google Chrome? Cela peut être ennuyeux, non? Que vous joigniez des documents aux e-mails, partagez des images sur les réseaux sociaux ou soumettez des fichiers importants pour le travail ou l'école, un processus de téléchargement de fichiers en douceur est crucial. Ainsi, il peut être frustrant que vos téléchargements de fichiers continuent d'échouer dans Chrome sur PC Windows. Si vous n'êtes pas prêt à abandonner votre navigateur préféré, voici quelques conseils pour les correctifs qui ne peuvent pas télécharger de fichiers sur Windows Google Chrome 1. Commencez par une réparation universelle avant de découvrir les conseils de dépannage avancés, il est préférable d'essayer certaines des solutions de base mentionnées ci-dessous. Dépannage des problèmes de connexion Internet: connexion Internet

Où se trouvent les journaux système à Linux? Où se trouvent les journaux système à Linux? Jun 24, 2025 am 12:15 AM

Les journaux dans les systèmes Linux sont généralement stockés dans le répertoire / var / journal, qui contient une variété de fichiers journaux clés, tels que Syslog ou Messages (enregistrements des journaux système), Auth.log (enregistrements d'événements d'authentification), Kern.log (Messages d'enregistrement du noyau), DPKG.Log ou Yum.log (Record Package Operations), boot.log (enregistrer les informations de démarrage); Le contenu du journal peut être visualisé via des commandes CAT, Tail-F ou JournalCTL; Les journaux d'applications sont souvent situés dans des sous-répertoires sous / var / log, tels que le répertoire Apache2 ou HTTPD d'Apache, les fichiers journaux MySQL, etc.; En même temps, il est nécessaire de noter que les autorisations de journal nécessitent généralement S

Qu'est-ce que la commande sudo et quand dois-je l'utiliser? Qu'est-ce que la commande sudo et quand dois-je l'utiliser? Jul 02, 2025 am 12:20 AM

Sudo signifie "SubstituteUserdo" ou "SuperUserDo", permettant aux utilisateurs d'exécuter des commandes avec des autorisations d'autres utilisateurs (généralement root). Ses utilisations de base incluent: 1. Effectuer des opérations au niveau du système telles que l'installation de logiciels ou l'édition de fichiers système; 2. Accès aux répertoires ou journaux protégés; 3. Gérer des services tels que le redémarrage de Nginx; 4. Modifier les paramètres globaux tels que / etc / h?tes. Lorsque vous l'utilisez, le système vérifiera la configuration / etc / sudoers et vérifiera le mot de passe utilisateur, fournira des autorisations temporaires au lieu de se connecter en continu en tant que racine, garantissant la sécurité. Les meilleures pratiques incluent: uniquement lorsque cela est nécessaire, évitez d'exécuter aveuglément des commandes de réseau, éditer des fichiers sudoers avec Visudo et considérer les opérations continues.

Comment gérer les groupes sur Linux Comment gérer les groupes sur Linux Jul 06, 2025 am 12:02 AM

Pour gérer les groupes d'utilisateurs Linux, vous devez ma?triser le fonctionnement de la visualisation, de la création, de la suppression, de la modification et du réglage des attributs de l'utilisateur. Pour afficher les informations du groupe d'utilisateurs, vous pouvez utiliser CAT / etc / groupe ou GetEntGroup, utilisez des groupes [nom d'utilisateur] ou ID [nom d'utilisateur] pour afficher le groupe auquel l'utilisateur appartient; Utilisez GroupADD pour créer un groupe et utilisez GroupDel pour spécifier le GID; Utilisez GroupDel pour supprimer des groupes vides; Utilisez UserMod-AG pour ajouter des utilisateurs au groupe et utilisez UserMod-G pour modifier le groupe principal; Utilisez UserMod-G pour supprimer les utilisateurs du groupe en modifiant / etc / groupe ou en utilisant la commande VIGR; Utilisez GroupMod-N (Nom de modification) ou GroupMod-G (modifier GID) pour modifier les propriétés du groupe et n'oubliez pas de mettre à jour les autorisations des fichiers pertinents.

Comment trouver mon adresse IP privée et publique dans Linux? Comment trouver mon adresse IP privée et publique dans Linux? Jul 09, 2025 am 12:37 AM

Dans Linux Systems, 1. Utilisez la commande IPA ou HostName-I pour afficher la propriété intellectuelle privée; 2. Utilisez curlifconfig.me ou curlipinfo.io/ip pour obtenir une adresse IP publique; 3. La version de bureau peut afficher IP privé via les paramètres système, et le navigateur peut accéder à des sites Web spécifiques pour afficher la propriété IP publique; 4. Les commandes communes peuvent être définies sous forme d'alias pour un appel rapide. Ces méthodes sont simples et pratiques, adaptées aux besoins de visualisation IP dans différents scénarios.

See all articles