Linux 程序通訊

2021-06-22 10:21:28 字數 2711 閱讀 8369

linux下程序通訊的八種方法:管道(pipe),命名管道(fifo),共享記憶體(shared memory),訊息佇列(message queue),訊號量(semaphore),訊號(signal),套接字(socket)

linux命令中,執行乙個程式,後面加上&,代表後台執行,也就是執行這個程式的同時,你的終端同時還會做其他的事情,如果不加這個符號,那麼你執行這個程式後,你的終端只能等這個程式執行完成後才能夠繼續執行其他操作。

(1) 管道(pipe):管道允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊;

舉例:

#include #include #include #include #include static int fd1[2],fd2[2];

void tell_wait()

void tell_parent(pid_t pid)

void wait_parent(void)

else

}void tell_child(pid_t pid)

void wait_child()else

}int main()

if(pid == 0)

else

exit(0);

}

(2) 命名管道(fifo):類似於管道,但是它可以用於任何兩個程序之間的通訊,命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfifo或系統呼叫mkfifo來建立;

有親緣關係:

#include #include #include #include #include #include #include #include #define file_mode (s_irusr | s_iwusr | s_irgrp | s_iroth)

#define fifo1 "/tmp/fifo.1"

#define fifo2 "/tmp/fifo.2"

int main()

if((mkfifo(fifo2,file_mode) < 0) && (errno != eexist))

//建立子程序

childpid = fork();

if(childpid == 0)

if(childpid == -1)

//防止死鎖,注意順序

writefd = open(fifo1,o_wronly,0);

readfd = open(fifo2,o_rdonly,0);

read(readfd,buf,100);

printf("client received a message form server: %s\n",buf);

printf("client input a mesage: ");

gets(buf);

write(writefd,buf,strlen(buf));

waitpid(childpid,null,0);

close(readfd);

close(writefd);

unlink(fifo1);

unlink(fifo2);

return 0;

}

無親緣關係:

server.c

//server程序 server.c 

#include "fifo.h"

int main()

if((mkfifo(fifo2,file_mode) < 0) && (errno != eexist))

readfd = open(fifo1,o_rdonly,0);

writefd = open(fifo2,o_wronly,0);

printf("server input a message: ");

gets(buf);

write(writefd,buf,strlen(buf));

read(readfd,buf,100);

printf("server received a message from client: %s\n",buf);

return 0;

}

client.c

//client程序 client

#include "fifo.h"

int main()

if((mkfifo(fifo2,file_mode) < 0) && (errno != eexist))

//防止死鎖,注意順序

writefd = open(fifo1,o_wronly,0);

readfd = open(fifo2,o_rdonly,0);

read(readfd,buf,100);

printf("client received a message form server: %s\n",buf);

printf("client input a mesage: ");

gets(buf);

write(writefd,buf,strlen(buf));

close(readfd);

close(writefd);

unlink(fifo1);

unlink(fifo2);

return 0;

}

參考資料: 

Linux程序通訊

linux程序通訊 無名管道主要用於有親緣關係的程序通訊,其位於外存區域,但在檔案系統中不可見。在實際應用中,程序通訊往往發生在無關程序之間,此種情形下,若仍想使用管道,則必須使用有名管道,也稱命名管道或fifo檔案。這種型別的管道在檔案系統中可見,建立時需要指定具體路徑和檔名,管道建立之後,可用l...

Linux 程序通訊

程序通訊 通訊 communication 意味著在程序間傳送資料。也把程序間控制資訊的交換稱為低階通訊,而把程序間大批量資料的交換稱為高階通訊。程序通訊的型別 1 共享儲存器系統 記憶體 共享儲存器系統為了傳送大量資料,在儲存器中劃出一塊共享儲存區,諸程序可通過對共享儲存區進行讀資料或寫資料以實現...

Linux程序通訊

lniux程序間通訊 目的 1.資料傳輸 乙個程序需要將他的資料傳送給另乙個程序 2.資源共享 多個程序之間共享同樣的資源 3.通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知他們發生了某種事件 4.程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望攔截另乙個程...