當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]1、進(jìn)程間通信簡(jiǎn)述 進(jìn)程間通信的幾種方式:無(wú)名管道、有名管道、消息隊(duì)列、共享內(nèi)存、信號(hào)、信號(hào)量、套接字(socket)。 進(jìn)程間通信是不同進(jìn)程直接進(jìn)行的一些接觸,這種接觸有簡(jiǎn)單,有復(fù)雜。機(jī)制不同,復(fù)雜度也不同。通信是一個(gè)廣義上的意 義,不僅指大批量數(shù)

1、進(jìn)程通信簡(jiǎn)述

進(jìn)程間通信的幾種方式:無(wú)名管道、有名管道、消息隊(duì)列、共享內(nèi)存、信號(hào)、信號(hào)量、套接字(socket)。

進(jìn)程間通信是不同進(jìn)程直接進(jìn)行的一些接觸,這種接觸有簡(jiǎn)單,有復(fù)雜。機(jī)制不同,復(fù)雜度也不同。通信是一個(gè)廣義上的意 義,不僅指大批量數(shù)據(jù)傳送,還包括控制信息的傳送,但是使用的方法都是大同小異的。

如圖所示進(jìn)程不是孤立的,不同的進(jìn)程需要進(jìn)行信息的交互和狀態(tài)的傳遞等,因此需要進(jìn)程間通信。

2、管道

管道分為無(wú)名管道和有名管道兩種方式。管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),但是無(wú)名管道和有名管道的區(qū)別是無(wú)名管道只能在具有親緣關(guān)系的進(jìn)程間通信,有名管道則是在無(wú)親緣關(guān)系進(jìn)程間通信。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。管道是Linux支持的最初Unix IPC形式之一,管道與管道之間通信其實(shí)就是一個(gè)文件,但它不是一個(gè)普通的文件,它不屬于某種文件系統(tǒng),而是自立門(mén)戶(hù),單獨(dú)構(gòu)成一種文件系統(tǒng)而且只存在內(nèi)存中。當(dāng)一個(gè)進(jìn)程向管道中寫(xiě)的內(nèi)容被管道另一端的進(jìn)程讀出;寫(xiě)入的內(nèi)容每次都會(huì)被添加到管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。如下圖所示。

那么,如何創(chuàng)建一條管道呢?下面,我們就來(lái)了解下FIFO函數(shù)。

FIFO不同于pipe函數(shù),因?yàn)樗峁┝艘粋€(gè)路徑名與之關(guān)聯(lián),以FIFO的文件形式存在于文件系統(tǒng)中,這樣,即使與FIFO的創(chuàng)建進(jìn)程不存在親緣關(guān)系的進(jìn)程,只要可以訪問(wèn)該路徑就能夠彼此通過(guò)FIFO互相通信,因此,通過(guò)FIFO不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。值得注意的是,F(xiàn)IFO嚴(yán)格遵循先進(jìn)后出,和棧的原則一樣,對(duì)管道以及FIFO的讀總是從開(kāi)始處返回?cái)?shù)據(jù),對(duì)它們的寫(xiě)則把數(shù)據(jù)添加到末尾。它們不支持諸如lseek()等文件定位操作。

需要包含的頭文件如下:

#include<sys/types.h>
#include<sys/stat.h>
#incldue<fcntl.h>
#include<unistd.h>

FIFO函數(shù)創(chuàng)建:

函數(shù)原型:

int mkfifo(const char *pathname,mode_t mode);

函數(shù)返回值 :

成功0,失敗-1

參數(shù)含義:

pathname為路徑名,創(chuàng)建管道的名字(該函數(shù)的第一個(gè)參數(shù)是一個(gè)普通的路徑名,也就是創(chuàng)建后FIFO的名字)。mode為創(chuàng)建fifo的權(quán)限(第二個(gè)參數(shù)與打開(kāi)普通文件的open()函數(shù)中的mode參數(shù)相同)。

注:如果mkfido的第一個(gè)參數(shù)已經(jīng)是一個(gè)已經(jīng)存在的路徑名時(shí),就會(huì)返回EEXIST錯(cuò)誤,所以當(dāng)我們調(diào)用的時(shí)候首先會(huì)檢查是否返回該錯(cuò)誤,如果返回該錯(cuò)誤那我們只需要直接調(diào)用打開(kāi)FIFO的函數(shù)即可。

FIFO比pipe函數(shù)打開(kāi)的時(shí)候多了一個(gè)打開(kāi)操作open;如果當(dāng)時(shí)打開(kāi)操作時(shí)為讀而打開(kāi)FIFO時(shí),若已經(jīng)有相應(yīng)進(jìn)程為寫(xiě)而打開(kāi)該FIFO,則當(dāng)前打開(kāi)操作將返回成功;否則,可能阻塞到有相應(yīng)進(jìn)程為寫(xiě)而打開(kāi)該FIFO;或者,成功返回。另一種情況就是為寫(xiě)而打開(kāi)FIFO時(shí),若已經(jīng)有相應(yīng)進(jìn)程為讀而打開(kāi)該FIFO,則當(dāng)前打開(kāi)操作將成功返回;否則可能會(huì)阻塞直到有相應(yīng)進(jìn)程為讀而打開(kāi)該FIFO;或者,返回ENIO錯(cuò)誤。

下面我們使用FIFO實(shí)現(xiàn)進(jìn)程間的通信。

(1)打開(kāi)一個(gè)文件,管道的寫(xiě)入端向文件寫(xiě)入數(shù)據(jù);管道的讀取端從文件中讀取出數(shù)據(jù)。

fifo_write.c

#include <stdio.h>
#include <string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define P_FIFO  "txt"

int main()
{
    int fd;
    //要寫(xiě)入有名管道的數(shù)據(jù)
    char buf[20] = "hello write_fifo";
    int ret=0;
    //創(chuàng)建有名管道,并賦予訪問(wèn)有名管道的權(quán)限
    ret = mkfifo(P_FIFO,0777);
    //創(chuàng)建失敗
    if(ret < 0)
    {
        printf("create named pipe failed.\n");
        return -1;
    }
    fd = open(P_FIFO,O_WRONLY);
    if(fd < 0)
    {
        printf("open failed.\n");
        return -2;
    }
    //寫(xiě)入數(shù)據(jù)到有名管道
    //第一個(gè)參數(shù)為有名管道文件描述符
    //第二個(gè)參數(shù)為寫(xiě)入有名管道的數(shù)據(jù)
    //第三個(gè)參數(shù)為寫(xiě)入有名管道的數(shù)據(jù)長(zhǎng)度
    write(fd,buf,sizeof(buf));
    //關(guān)閉有名管道
    close(fd);
    return 0;
}

fifo_read.c

#include <stdio.h>
#include <string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define P_FIFO  "txt"

int main()
{
    int ret;
    int fd;
    char buf[20];
    //打開(kāi)有名管道
    //第一個(gè)參數(shù)為有名管道文件路徑
    //第二個(gè)參數(shù)表明是以讀取方式并以非阻塞方式打開(kāi)有名管道
    //O_RDONLY讀取模式
    //O_NONBLOCK非阻塞方式
    fd = open(P_FIFO,O_RDONLY);
    if(fd<0)
    {
        printf("open fail\n");
        return -1 ;
    }
    //循環(huán)讀取有名管道
    while(1)
    {
        memset(buf,0,sizeof(buf));
        if(read(fd,buf,sizeof(buf)) == 0)
        {
            printf("nodata.\n");
        }
        else
        {
            printf("getdata:%s\n",buf);
            break;
        }
   }
   close(fd);
   return 0;
}

下面先將fifo_write.c和fifo_read.c分別編譯成fifo_write和fifo_read兩個(gè)可執(zhí)行程序:

接下來(lái),先運(yùn)行fifo_write,然后打開(kāi)另一個(gè)終端,接著運(yùn)行fifo_read,運(yùn)行fifo_write的時(shí)候,可以看到程序阻塞在終端:

下面打開(kāi)另外一個(gè)終端運(yùn)行fifo_read

切換到另外一個(gè)終端,在終端輸入ls –l可以看到由于fifo_write中創(chuàng)建了管道文件txt,從前面的字串prwxr-xr-x中的p可以知道,這是一個(gè)管道文件,如下圖所示:

運(yùn)行fifo_read,這時(shí)候,可以看到從管道中獲取的字符串hello write_fifo,如下圖所示:

管道讀取結(jié)束后,fifo_write這個(gè)程序也就不會(huì)在阻塞在終端了,如下圖所示:

寫(xiě)管道程序還要注意,一旦我們創(chuàng)建了FIFO,就可以用open去打開(kāi)它,可以使用open、read、close等去操作FIFO和pipe有相同之處,當(dāng)打開(kāi)FIFO時(shí),非阻塞標(biāo)志(O_NONBLOCK)將會(huì)對(duì)讀寫(xiě)產(chǎn)生如下影響:

  • 1、沒(méi)有使用O_NONBLOCK:訪問(wèn)要求無(wú)法滿(mǎn)足時(shí)進(jìn)程將阻塞。如試圖讀取空的FIFO,將導(dǎo)致進(jìn)程阻塞;
  • 2、使用O_NONBLOCK:訪問(wèn)要求無(wú)法滿(mǎn)足時(shí)不阻塞,立即出錯(cuò)返回,errno是ENXIO。

3、消息隊(duì)列

消息隊(duì)列(也叫做報(bào)文隊(duì)列)提供了一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送一個(gè)數(shù)據(jù)塊的方法。每個(gè)數(shù)據(jù)塊都被認(rèn)為含有一個(gè)類(lèi)型,接收進(jìn)程可以獨(dú)立地接收含有不同類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。我們可以通過(guò)發(fā)送消息來(lái)避免命名管道的同步和阻塞問(wèn)題。但是消息隊(duì)列與命名管道一樣,每個(gè)數(shù)據(jù)塊都有一個(gè)最大長(zhǎng)度的限制。

打開(kāi)或者創(chuàng)建消息隊(duì)列的內(nèi)核持續(xù)性要求每個(gè)消息隊(duì)列都在系統(tǒng)范圍內(nèi)對(duì)應(yīng)唯一的鍵值,所以,要獲得一個(gè)消息隊(duì)列的描述字,只需要提供該消息隊(duì)列的鍵值即可。

消息讀寫(xiě)操作非常簡(jiǎn)單,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),每個(gè)消息都類(lèi)似如下的數(shù)據(jù)結(jié)構(gòu):

struct msgbuf
{
 long mtype;
 char mtext[1];
};

3.1、msgget函數(shù)

該函數(shù)用來(lái)創(chuàng)建或者訪問(wèn)一個(gè)消息隊(duì)列。

int msgget(key_t key, int msgflg);

與其他的IPC機(jī)制一樣,程序必須提供一個(gè)鍵來(lái)命名某個(gè)特定的消息隊(duì)列。msgflg是一個(gè)權(quán)限標(biāo)志,表示消息隊(duì)列的訪問(wèn)權(quán)限,它與文件的訪問(wèn)權(quán)限一樣。msgflg可以與IPC_CREAT做或操作,表示當(dāng)key所命名的消息隊(duì)列不存在時(shí)創(chuàng)建一個(gè)消息隊(duì)列,如果key所命名的消息隊(duì)列存在時(shí),IPC_CREAT標(biāo)志會(huì)被忽略,成功則返回一個(gè)以key命名的消息隊(duì)列的標(biāo)識(shí)符(非零整數(shù)),失敗時(shí)返回-1。

3.2、msgsnd函數(shù)

該函數(shù)用來(lái)向消息隊(duì)列發(fā)送一個(gè)消息。

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

將發(fā)送的消息存儲(chǔ)在msgp指向的msgbuf結(jié)構(gòu)中,消息大小由msgsz指定。對(duì)發(fā)送的消息來(lái)說(shuō),有意義的msgflg標(biāo)準(zhǔn)為IPC_NOWAIT,指明在消息隊(duì)列沒(méi)有足夠的空間容納要發(fā)送的消息時(shí),msgsnd是否等待。造成msgsnd()等待的條件有兩種:當(dāng)前消息的大小與當(dāng)前消息隊(duì)列中的字節(jié)數(shù)之和超過(guò)了消息隊(duì)列的總?cè)萘?;?dāng)前消息隊(duì)列的消息數(shù)不小于消息隊(duì)列的總?cè)萘浚藭r(shí),雖然消息隊(duì)列中的消息數(shù)目并不多,但基本上都只有一個(gè)字節(jié)。調(diào)用成功的時(shí)候返回0,失敗返回-1.

3.3、msgrcv函數(shù)

該函數(shù)用來(lái)從一個(gè)消息隊(duì)列獲取消息。

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

msgrcv函數(shù)前面三個(gè)參數(shù)和msgsnd函數(shù)的三個(gè)參數(shù)一樣不做講解。msgtype可以實(shí)現(xiàn)一種簡(jiǎn)單的接收優(yōu)先級(jí)。如果msgtype為0,就獲取隊(duì)列中的第一個(gè)消息。如果它的值大于零,將獲取具有相同消息類(lèi)型的第一個(gè)信息。如果它小于零,就獲取類(lèi)型等于或小于msgtype的絕對(duì)值的第一個(gè)消息。msgflg用于控制當(dāng)隊(duì)列中沒(méi)有相應(yīng)類(lèi)型的消息可以接收時(shí)將發(fā)生的事情。當(dāng)調(diào)用成功時(shí),該函數(shù)返回放到接收緩存區(qū)中的字節(jié)數(shù),消息被復(fù)制到由msg_ptr指向的用戶(hù)分配的緩存區(qū)中,然后刪除消息隊(duì)列中對(duì)應(yīng)的消息;失敗則返回-1.

3.4、msgctl函數(shù)

該函數(shù)用來(lái)控制消息隊(duì)列。

int msgctl(int msgid, int command, struct msgid_ds *buf);

該系統(tǒng)調(diào)用對(duì)由msqid標(biāo)識(shí)的消息隊(duì)列執(zhí)行cmd操作,共有三種cmd操作:

  • IPC_STAT:把msgid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為消息隊(duì)列的當(dāng)前關(guān)聯(lián)值,即用消息隊(duì)列的當(dāng)前關(guān)聯(lián)值覆蓋msgid_ds的值。
  • IPC_SET:如果進(jìn)程有足夠的權(quán)限,就把消息列隊(duì)的當(dāng)前關(guān)聯(lián)值設(shè)置為msgid_ds結(jié)構(gòu)中給出的值。
  • IPC_RMID:刪除消息隊(duì)列。buf是指向msgid_ds結(jié)構(gòu)的指針,它指向消息隊(duì)列模式和訪問(wèn)權(quán)限的結(jié)構(gòu)。成功返回0,否則返回-1。

通過(guò)上面的函數(shù)我們清楚如何去創(chuàng)建一個(gè)消息隊(duì)列那我們簡(jiǎn)單的來(lái)看一個(gè)案例。

(1)創(chuàng)建一條消息隊(duì)列msg_get.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(void)
{
 int  msgid ; 
 //創(chuàng)建消息隊(duì)列,注意,創(chuàng)建后面要有IPC_CREAT標(biāo)志
 msgid = msgget(0x123456 , IPC_CREAT | 0777);
 if(msgid < 0)
 {
  perror("msgget fail");
  return -1 ; 
 }
 printf("success ... ! \n");
 return 0  ;
}

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

那消息隊(duì)列呢?怎么查看?使用ipcs –q命令可以查看到剛剛我們創(chuàng)建的消息隊(duì)列0x123456。

(2)向消息隊(duì)列發(fā)送消息 msgsend.c

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(void)
{
    int msgid ;
    msgid = msgget(0x123456 , 0);
    if(msgid == -1)
    {
        perror("create msg queue fail");
        return -1 ;
    }
    printf("open msg success ... \n");
    int ret ;
    char *p = "hello world" ;
   //發(fā)送hello world到消息隊(duì)列0x123456
   //在這里可以直接發(fā)送
    ret = msgsnd(msgid , p , strlen(p) , 0);
    if(ret == -1)
    {
        perror("send msgid fail");
        return -2 ;
    }
    return 0 ;
}

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

使用ipcs –p命令查看:

(3)獲取消息隊(duì)列中的信息 msgrecv.c 在上面msgsend.c的基礎(chǔ)上,這個(gè)例程將上面發(fā)送到消息隊(duì)列的信息讀取回來(lái)。

#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(void)
{
    int msgid ;
    msgid = msgget(0x123456 , 0);
    if(msgid == -1)
    {
        perror("create msg queue fail");
        return -1 ;
    }
    printf("open msg success ... \n");
    int ret ;
    char buffer[1024] = {0};
    //接收消息隊(duì)列中的信息
    ret = msgrcv(msgid , buffer , 11 , 0 , 0);
    if(ret == -1)
    {
        perror("recv msgid fail");
        return -2 ;
    }
    printf("ret: %d  buffer:%s \n" , ret , buffer);
    return 0 ;
}

運(yùn)行結(jié)果,如圖所示:

那么,如何刪除一個(gè)消息隊(duì)列呢?先用ipcs –q查看消息隊(duì)列,如圖所示:

有兩種方法:

  • 1、使用命令ipcrm –q msqid 刪除消息隊(duì)列,如圖所示

  • 2、使用msgctl函數(shù),寫(xiě)IPC_RMID標(biāo)志刪除消息隊(duì)列

(4)刪除消息隊(duì)列 msgrm.c

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(void)
{
    int  msgid ;
    msgid = msgget(0x123456 , 0);
    if(msgid < 0)
    {
        perror("msgget fail");
        return -1 ;
    }
    printf("success ... ! msgid:%d \n" , msgid);
    //寫(xiě)IPC_RMID標(biāo)志
    if(msgctl(msgid , IPC_RMID , NULL) == 0)
    {
        printf("remove success ... \n");
    }
    return 0  ;
}

運(yùn)行結(jié)果,如圖所示:

使用系統(tǒng)提供的API的方式,可以將消息隊(duì)列刪除。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn),相對(duì)于管道通信有很大的改觀,而且消息隊(duì)列對(duì)數(shù)據(jù)的順序處理也是非常有條理性的不會(huì)產(chǎn)生混雜性。

往期精彩

Linux 進(jìn)程必知必會(huì)

【Linux系統(tǒng)編程】IO標(biāo)準(zhǔn)緩沖區(qū)

【Linux系統(tǒng)編程】可重入和不可重入函數(shù)

韋東山:6000字長(zhǎng)文告訴你如何學(xué)習(xí)linux

會(huì)C/C++就可以開(kāi)發(fā)Linux/Android應(yīng)用程序?Yoxios了解一下!

覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉