1. 程式人生 > >linux檔案拷貝(程序方法)

linux檔案拷貝(程序方法)

生氣檔案拷貝,父程序拷貝該檔案的前一半,子程序拷貝後一半

/*************************************************************************
	> File Name: work.c
	> Author: XXDK
	> Email: [email protected] 
	> Created Time: Wed 15 Mar 2017 01:41:55 AM PDT
 ************************************************************************/

#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<fcntl.h>

int main(int argc, const char *argv[])
{
	char buf[32] = {0};
	int fsrc, fdest;
	int file_len = 0;
	int file_len_half = 0;
	int ret = 0;
	int count = 0;
	int count_rmd = 0;
	pid_t pid;

	if(argc < 3) {
		perror("wokao");
		exit(-1);
	}

	fsrc = open(argv[1], O_RDONLY);
	if(fsrc < 0) {
		perror("open src error");
		exit(-1);
	}
	fdest = open(argv[2], O_CREAT|O_WRONLY|O_TRUNC);
	if(fdest < 0) {
		close(fsrc);
		perror("open dest error");
		exit(-1);
	}
	printf("ready!\n");

	file_len = lseek(fsrc, 0, SEEK_END);
	file_len_half = file_len / 2;

	count_rmd = file_len_half % sizeof(buf);// 計算最後一次拷貝幾個位元組
	count = file_len_half / sizeof(buf);	// 計算需要拷貝多少個32次

	printf("file length: %d bytes, file half lenght: %d\n", file_len, file_len/2);
	//-----------------------------------------------------------------------------
	if((pid = fork()) == 0) {// child process
		int i;
		lseek(fdest, file_len_half, SEEK_SET);
		lseek(fsrc, file_len_half, SEEK_SET);
		while(1) {

			ret = read(fsrc, buf, sizeof(buf));
			i++;
			
			if(count == i) {
				ret = read(fsrc, buf, count_rmd);
			}
			write(fdest, buf, ret);
			if(count == i)
				break;
		}
		close(fdest);
		close(fsrc);
	} else if(pid > 0) { // parent process
		int i = 0;
		lseek(fsrc, 0, SEEK_SET);
		while(1) {
			ret = read(fsrc, buf, sizeof(buf));
			i++;
			
			if(count == i) {
				ret = read(fsrc, buf, count_rmd);
			}
			write(fdest, buf, ret);
			if(count == i)
				break;
		}
		waitpid(-1, NULL, 0);
	} else {
		perror("fuck error");
		close(fdest);
		close(fsrc);
		exit(-1);
	}

	exit(0);
}


相關推薦

linux檔案拷貝程序方法

檔案拷貝,父程序拷貝該檔案的前一半,子程序拷貝後一半 /************************************************************************* > File Name: work.c > Autho

Linux作業系統知識點六:作業系統的功能——檔案管理程序管理

回顧:作業系統的功能 1.處理器管理 2.儲存管理 3.裝置管理 4.檔案管理 5.作業管理 程序 概念 可併發執行、具有獨立功能的程式(program)關於某個資料集合的一次執行活動。是作業系統進行資源分配和排程執行的基本單位。 程序的特性: 動態性(程序的最基

linux 檔案傳輸3種

一、scp 用於linux之間檔案傳輸 二、sftp(推薦,速度快) securecrt 按下ALT+P就開啟新的會話 進行ftp操作。 輸入:help命令,顯示該FTP提供所有的命令 pwd: 查詢linux主機所在目錄(也就是遠端主機目錄)

Linux - 檔案許可權未完

檔案許可權說明 檔案許可權有四種:可讀、可寫、可執行、無 檔案許可權作用物件有三種:擁有者、使用者組使用者、其他使用者 擁有者:檔案擁有者,預設情況下,誰建立的檔案擁有者就是誰,例如使用dev使用者建立的檔案則擁有者為dev 使用者組使用者:使用者組用於多人協作,每

Linux檔案管理 實驗3

實驗報告 實驗名稱: Linux檔案管理  實驗目的: 1、 掌握檔案管理的基本內容和原理; 2、瞭解檔案和目錄操作的系統呼叫使用者介面; 實驗要求:熟悉Linux檔案目錄管理各種功能命令 1、 用root賬號登入到終端,使用pwd命令檢視當前目錄   2、 用cd命令將當

Java實現檔案拷貝位元組流

/** * 拷貝檔案示例(位元組流) */ package JavaIO; import java.io.*; /** * @author 16026 * */ public class

在Mac/linux上查詢並終止程序鎖定特定埠的幾種方法

前言  無論是做網站還是做產品,經常使用到殺死某個程序的方法。製作指令碼並熟悉運用是一個非常節省時間的方法。 基本命令  查詢: [sudo] lsof -i :3000  殺戮 kill -9 方法一  使用awk指令碼: port=8000 lsof -i:$port | awk '

Linux mint界面過小無法安裝解決方法

log 無法顯示 tin splay 安裝 isp 分區 src es2017 安裝Linux mint時,到了分區的時候,有時候會出現界面過小(就是你點擊不到確定鍵): 大家可以看到下面的確定鍵無法顯示,導致無法安裝。網上查了一下都是清一色的下載vwware tool插

js通過URL下載伺服器檔案可行方法

本文講述已知檔案在伺服器的地址,如何下載至本地 其他部落格分享的一般是這兩種 1.通過window.open window.open('https://1.1.1.1/test.txt') 2.通過get表單請求 var $form = $('<form method=

在Ubuntu安裝和使用Anbox完整說明一種在Linux使用Android應用的方法

在Ubuntu安裝和使用Anbox完整說明(一種在Linux使用Android應用的方法) Anbox是一種基於容器的方法,用於在常規GNU/Linux系統 https://anbox.io上啟動完整的Android系統,相似但不同的專案還有Shashlik和Genimob

linux下的C語言開發程序等待

                【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    所謂程序等待,其實很簡單。前面我們說過可以用fork建立子程序,那麼這裡我們就可以使用wait函式讓父程序等待子程序執行結束後才開始執行。注意,為了證明父程序確實是等

Linux 下程式設計C語言獲取檔案大小

程式碼: #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int m

Linux下程式C語言實現對檔案的複製

目標: 使用系統呼叫實現cp命令。 原理: 使用系統呼叫open開啟檔案,使用read從檔案讀資料,使用write向檔案寫資料。 傳給可執行程式的引數個數存放在main函式的argc中,引數首地址存放在指標陣列argv中。 我的程式碼: #include <stdio.h&

Linux 執行緒程序數限制分析

1.問題來源 公司線上環境出現MQ不能接受訊息的異常,運維和開發人員臨時切換另一臺伺服器的MQ後恢復。同時運維人員反饋在出現問題的伺服器上很多基本的命令都不能執行,出現如下錯誤: 2.   初步原因分析和解決 讓運維的兄弟在服務上檢視記憶體、CPU、網路、IO

Linux伺服器檔案和windows本機檔案互傳方法(本地檔案上傳Linux,Linux檔案下載到本機

1、windows系統中下載XShell安裝檔案。下載地址:https://www.newasp.net/soft/384562.html  2、安裝之後,新建會話輸入遠端linux的賬號和密碼。 3、上傳檔案:在shell終端模擬器中輸入命令rz,即可從本機選擇檔案利用Zmodem上傳到伺服器

Linux檔案操作

1、create(建立檔案函式) 函式原型:int creat(const char *filename,mode_t mode) 寫法:①creat(*/home/hello.c*,S_IRUSR) ②creat(*/home/hello.c*,0666) 常建立模式:S

linux Ubuntu16上搭建ceph分散式檔案系統四節點實測有效!

特別注意:如果命令直接複製粘貼出現錯誤,則手動輸入可解決參考教程:第一步~~~.準備  4個Ubuntu 16.04 Server 虛擬機器(可以使用VMware或者VirtualBox)配置好每個虛擬機器的IP 以及hostname (很重要!)我的四臺虛擬機器配置如下:(

Log4j配置檔案被覆蓋,log4j.properties無效檢查方法

log4j: Trying to find [log4j.xml] using context classloader [email protected] log4j: Using URL [jar:file:/F:/maven_dir/com/baidu/unionlogin/1.0/unionl

Linux 基礎知識 之 ISCSI 檔案系統 磁碟共享

一、iSCSI簡介 iscsi是一種塊級別的協議,用於通過TCP/IP網路共享原始儲存裝置,即硬碟的共享。可以用已經存在的IP和乙太網如網絡卡、交換機、路由器等通過iSCSI協議共享和訪問儲存。 iSCSI target是一種由遠端iSCSI伺服器(target)提供的遠端硬碟。 二、磁

Linux檔案子系統 VFS的初始化

目錄   概述 檔案的描述 VFS系統的資料型別 各個資料結構之間的關係 VFS初始化 概述 Linux世界中一切都是檔案,Linux檔案子系統VFS(Virtual Filesystem)為使用者提供了檔案和檔案系統的相關介面,系統中所有檔案系統依賴V