① 在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線程間可否用管道通訊,如何實現
線程間通信有很多種。如果僅僅使用共享的變數來交換數據,那麼不需要通過內核。 但是,共享變數為了保證同步,通常會進行互斥操作,這個是需要通過內核的。