導航:首頁 > 操作系統 > linux管道實現

linux管道實現

發布時間:2022-05-30 00:31:15

① 在linux程序中如何使用命名管道實現對文件的讀寫、求幫助

//創建server管道。
mkfifo(Server_FIFO_Name,0777);

//打開伺服器埠,等待讀取。此時如果客戶端還未寫入數據伺服器端會被阻塞。
server_fifo_fd = open(Server_FIFO_Name , O_RDONLY);
if( -1 == server_fifo_fd ){
fprintf( stderr , "Server fifo failure\n" );
exit(EXIT_FAILURE);
}

//從管道中讀取數據。
read_res = read ( server_fifo_fd , &my_data , sizeof(my_data));
if(read_res > 0){
//將字元串翻轉.
reverse ( my_data.str );
//將客戶端的pid號加入回送管道文件名中.
sprintf ( client_fifo, Client_FIFO_Name , my_data.client_pid);
//打開回送管道。
client_fifo_fd = open ( client_fifo , O_WRONLY );
if( -1 != client_fifo_fd ){
//向管道中寫入返回的數據.
write ( client_fifo_fd , &my_data, sizeof(my_data));
close ( client_fifo_fd );
}
}

② linux 管道原理

Linux原理的學習,我打算由淺入深,從上之下,也就是先了解個大概再逐個深入。先了解一下Linux的進程先。

一、Linux進程上下文

Linux進程上下文,我理解就是進程組成元素的集合。包括進程描述符tast_struct,正文段,數據段,棧,寄存器內容,頁表等。

1)tast_struct

它是一種數據結構,存儲著進程的描述信息,例如pid,uid,狀態,信號項,打開文件表等。是進程管理和調度的重要依據。

2)用戶棧和核心棧

顧名思義,用戶棧是進程運行在用戶態使用的棧,含有用戶態執行時候函數調用的參數,局部變數等;核心棧是該進程運行在核心態下用的棧,保存調用系統函數所用的參數和調用序列。這兩個棧的指針都保存在tast_struct結構中。

3)寄存器

保存程序計數器,狀態字,通用寄存器,棧指針。

4)頁表

線性地址到物理地址的映射

5)正文段,數據段。

二、Linux進程的狀態

Linux中進程共有5個狀態:就緒,可中斷睡眠,不可中斷睡眠,暫停,僵死。也就是說,linux不區分就緒和運行,它們統一叫做就緒態。進程所處的狀態記錄在tast_struct中。

三、進程的控制

1)進程樹的形成

計算機啟動後,BIOS從磁碟引導扇區載入系統引導程序,它將Linux系統裝入內存,並跳到內核處執行,Linux內核就執行初始化工作:初始化硬體、初始化內部數據結構、建立進程0。進程0創建進程1,進程1是以後所有創建的進程的祖先,它負責初始化所有的用戶進程。進程1創建shell進程,shell進程顯示提示符,等待命令的輸入。

2)進程的創建

任何一個用戶進程的創建都是由現有的一個進程完成的,進程的創建要經過fork和exec兩個過程。Fork是為新進程分配相應的數據結構,並將父進程的相應上下文信息復制過來。Exec是將可執行文件的正文和數據轉入內存覆蓋它原來的(從父進程復制過來的),並開始執行正文段。

3)進程的終止

系統調用exit()就可自我終結,exit釋放除了tast_struct以外的所有上下文,父進程收到子進程終結的消息後,釋放子進程的tast_struct。

4)進程的調度

進程的調度是由schele()完成的,一種情況是,當處理機從核心態向用戶態轉換之前,它會檢查調度標志是否為1,如果是1,則運行schele(),執行進程的調度。另一種情況是進程自動放棄處理機,時候進行進程調度。

進程的調度過程分為兩步,首先利用相關策略選擇要執行的進程,然後進行上下文的切換。

四、進程的通信

進程的通信策略主要有,消息,管道,消息隊列,共享存儲區和信號量。

1)信息

消息機制主要是用來傳遞進程間的軟中斷信號,通知對方發生了非同步事件。發送進程將信號(約定好的符號)發送到目標進程的tast_struct中的信號項,接收進程看到有消息後就調用相應的處理程序,注意,處理程序必須到進程執行時候才能執行,不能立即響應。

2)管道

我理解就是兩個進程使用告訴緩沖區中的一個隊列(每兩個進程一個),發送進程將數據發送到管道入口,接收進程從管道出口讀數據。

3) 消息隊列

消息隊列是操作系統維護的一個個消息鏈表,發送進程根據消息標識符將消息添加到制定隊列中,接收進程從中讀取消息。

4)共享存儲區

在內存中開辟一個區域,是個進程共享的,也就是說進程可以把它附加到自己的地址空間中,對此區域中的數據進行操作。

5)信號量

控制進程的同步。

③ linux如何用管道實現顯示文件內容,然後在文件最後顯示行數等信息

cat 文件名稱 | wc -l

④ linux管道實現sftp自動登陸

lftp -u user,pass sftp://x.x.x.x

⑤ Linux C 通過管道實現文件復制

#include"stdio.h"
#include"stdlib.h"
#include"unistd.h"
#include"sys/types.h"
#include"sys/stat.h"
#include"string.h"
#include"fcntl.h"
#include"errno.h"

#define FIFO1 "/tmp/fifo"
#define MAXLINE 100

void client1(int);
void client2(int);

int main(int argc,char **argv)
{
int writefd;
writefd=open(FIFO1,O_WRONLY,0);
client1(writefd);
client2(writefd);

close(writefd);
unlink(FIFO1);
exit(0);
}

void client1(int writefd1)//實現從文件寫到管道,自己創建一個aa.txt文件
{
char buff[MAXLINE];
int fd;
memset(buff,0,sizeof(buff));
fd=open("aa.txt",O_CREAT|O_RDWR,S_IRWXU);
read(fd,buff,sizeof(buff));
write(writefd1,buff,sizeof(buff));
close(fd);
}
void client2(int writefd2)//)//實現從管道寫到另一個文件
{
char buff[MAXLINE];
int fd;
fd=open("bb.txt",O_CREAT|O_RDWR,S_IRWXU);
read(writefd2,buff,sizeof(buff));
write(fd,buff,sizeof(buff));
close(fd);

}

我這里省略了許多判斷,自己加哈
如有問題,在線交流

⑥ linux 管道和輸入輸出重定向如何用c語言結合實現

兩種方法(實用)
1:直接系統調用,管道建立分命名管道和非命名管道,使用參考unix手冊或UNP第二卷進程間通信。輸入輸出重定向就用read(source);write(destination);
2:使用系統shell
功能:即調用
system("cat
file.a
|
grep
bb
>
file.c");

⑦ Linux下利用匿名管道實現父子進程通信,要求從父進程輸入整數 n 到子進程,算出1到n的偶數和

#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

intmain()
{
intfd[2];

//創建二個fd,fd[0]管道用於讀,fd[1]管道用於寫
pipe(fd);

//創建進程
pid_tpid=fork();
if(pid==0)
{
//子進程,讀取整數n
intn;
read(fd[0],&n,sizeof(int));

//計算1-n的偶數和
intsum=0;
for(inti=1;i<=n;++i)
{
if(i%2==0)
{
sum+=i;
}
}

printf("Thesumofallevennumberfrom1to%dis%d ",n,sum);

//子進程工作完後使用exit(0)退出
exit(0);
}
else
{
//父進程,寫入整數n
intn;
printf("Pleaseinputn:");
scanf("%d",&n);

write(fd[1],&n,sizeof(int));
}
}

Linux 環境下編譯及測試結果如下:

⑧ 在linux下可以用命名管道實現c程序與qt的數據通信嗎

當然可以了。不過可以直接使用dbus進行進程間通訊,C程序發送數據(libdbus),Qt去捕獲信號(QDbus),這樣來的更方便點,否則你要自己封裝管道的收發介面。

⑨ Linux管道實驗題

<pre t="code" l="cpp">#include <unistd.h>
#include <stdio.h>

//警告: 該程序未做錯誤驗證, 未關閉管道(由系統自動關閉)

int main()
{
int p2c[2]; // 該管道父進程寫,子進程讀
int c2p[2]; // 該管道子進程寫,父進程讀

// 創建2條管道
pipe(p2c);
pipe(c2p);

int pid = fork();
int fd_read, fd_write; // 這兩個描述符用於保存某進程讀端和寫端
int pid_my; // 保存某進程自身的pid
int pid_other; // 另一進程的pid,通過

if ( pid == 0 ) { // 子進程
fd_read = p2c[0];
fd_write= c2p[1];
// 通過getpid取得自身pid,寫到管道里
pid_my = getpid();

write(fd_write, pid_my, sizeof(int));
// 從另一管道讀取另一進程的pid
read(fd_read, pid_other, sizeof(int));
// 列印讀取到的pid
printf("Recive pid : %d\n", pid_other);
} else { // p
fd_read = c2p[0];
fd_write= p2c[1];
pid_my = getpid();
// 由於子進程是先寫自身pid,父進程最好先讀取子進程的pid
read(fd_read, pid_other, sizeof(int));
write(fd_write, pid_my, sizeof(int));

printf("Recive pid : %d\n", pid_other);
}

return 0;
}

⑩ Linux線程間可否用管道通訊,如何實現

線程間通信有很多種。如果僅僅使用共享的變數來交換數據,那麼不需要通過內核。 但是,共享變數為了保證同步,通常會進行互斥操作,這個是需要通過內核的。

閱讀全文

與linux管道實現相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:27
不能修改的pdf 瀏覽:751
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491