程式要求:
程式如下:
1、server.c
#include #include #include #include #include #include #include #include typedef struct //定義乙個資料結構用於fifo中資料傳送
package;
static void child_read(char * , int *);
static void father_write(int *);
int main(int argc, char *argv)
if (pipe(pipe_fd) < 0) //建立pipe用於子程序與父程序之間的通訊
if ((pid = fork()) < 0)
if (pid == 0)
child_read(argv[1], pipe_fd); //子程序讀取fifo中的資料
else
father_write(pipe_fd); //父程序寫入fifo資料
return 0;
}static void child_read(char *arg, int *pipe_fd)
open_flag = 1;}}
if (open_flag == 0)
}while (read(server_fifo, &recv_package, sizeof(recv_package)) > 0) //讀取fifo中的資料
return ;
}static void father_write(int *pipe_fd)
printf("server>");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = 0;
write(client_fifo, buf, strlen(buf) + 1); //往客戶專用fifo中寫入資料
}return ;
}
2、client.c
#include #include #include #include #include #include #include #include typedef struct
package;
static void child_read(void);
static void father_write(int , int );
int main(int argc, const char *argv)
if ((server_fifo = open(argv[1], o_rdwr)) < 0) //開啟眾所周知的fifo
if ((pid = fork()) < 0)
if (pid == 0)
child_read(); //子程序讀
else
father_write(server_fifo, pid); //父程序寫
return 0;
}static void child_read(void)
open_flag = 1;}}
if (open_flag == 0)
}while (read(client_fifo, buf, sizeof(buf)) > 0) //讀取客戶專用fifo中的資料
printf("recv: %s\n", buf);
return ;
}static void father_write(int server_fifo, int pid)
return ;
}
注:該程式還存在一定的問題等待改善,但是可以基本實現以上模型的功能
1、伺服器端在應對多客戶端情況下,存在一定的混亂問題
2、伺服器端收到客戶端請求後只能寫回答一次,要再次寫回答需要客戶端再次傳送請求,否則會出現錯誤!
Linux系統程式設計 管道和FIFO
ls wc l 為執行上述命令,shell建立了兩個程序來分別執行ls和wc。通過管道連線兩個程序。管道是單向的,允許資料從乙個程序流向另乙個程序。管道是乙個位元組流意味著在使用管道時不存在訊息或訊息邊界。從管道中讀取資料的程序可以讀取任意大小的資料塊,而不管寫入程序寫入管道的資料塊大小。通過管道的...
Linux系統程式設計 fifo命名管道
fifo也被稱為命名管道。未命名的管道只能在兩個相關的程序之間使用,而且這兩個程序還有乙個共同的建立了他們的祖先程序,但是fifo,不相關的程序也能交換資料。fifo是一種檔案型別,fifo的建立有兩種方式。1.直接用命令建立 mkfifo 2.利用函式建立 int mkfifo const cha...
Linux系統程式設計之FIFO通訊
fifo 有名管道 應用於非血緣關係程序間 不能反覆讀取 例如 04 fifo w.c include include include include include include int main 當前目錄有乙個myfifo檔案 開啟fifo檔案 printf begin write.n int...