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程序 此時控制程序希望攔截另乙個程...