歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux系統開發 2 文件IO open() close() read() write() perror() lseek() fcntl() ioctl()

本文謝絕轉載,原文來自http://990487026.blog.51cto.com
大綱

Linux系統開發

	man 文檔的使用
	文件IO
		open() 創建文件,指定權限位
		open() 接收參數 創建文件
		open() 傳兩個參數 第三個參數從內存取垃圾值
		write()函數 向文件寫數據
		write()函數的覆蓋操作
		open()函數文件的追加
		open() 創建文件,如果文件已經存在,就報錯
		測試一個程序最多能創建1021個文件,3個STDIN STDOUT STDERR已經存在了
		通過ulimit命令也可以直接查詢最多可以創建多少文件
		修改ulimit -n 改變最大創建文件個數
		最大最大能打開多少文件,取決於系統,據說是根據內存大小有關系
		read write 文件復制(非二進制)
		阻塞演示:輸入輸出必須等待回應才能執行下一步
		非阻塞程序:
		perror 報錯函數
		打印出錯誤的原因
		Linux所有錯誤代碼
		文件lseek操作
		lseek獲取文件的大小
		fcntl獲取或者設置文件的訪問控制屬性
		fcntl實例,以阻塞模式打開stdin,設置為非阻塞模式
		ioctl 獲取終端的行高 與 列寬
		ioctl獲取分辨率

	習題

man page的使用
1、Standard commands (標准命令)
2、System calls (系統調用)
3、Library functions (庫函數)
4、Special devices (設備說明)
5、File formats (文件格式)
6、Games and toys (游戲和娛樂)
7、Miscellaneous (雜項)
8、Administrative Commands (管理員命令)
9 其他(Linux特定的), 用來存放內核例行程序的文檔。

2016-08-01_20:02:34chunli@http://990487026.blog.51cto.com~$ man 3 printf
2016-08-01_20:02:34chunli@http://990487026.blog.51cto.com~$ man 2 open

linux API函數 open函數,創建文件,指定權限位
2016-08-01_17:48:54root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
//linux api	man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
	int ret = open("abc",O_CREAT,0777);//設置權限位為777
	printf("%d\n",ret);
	return 0;

}
編譯運行:
2016-08-01_17:47:40root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app 
3

可以看到abc
2016-08-01_17:49:17root@http://990487026.blog.51cto.com~/linux_c# ll 
total 16K
-rwxr-xr-x 1 root   root      0 Aug  1 17:47 abc*
-rwxr-xr-x 1 root   root   8.5K Aug  1 17:48 app*
-rw-rw-r-- 1 chunli chunli  215 Aug  1 17:48 main.c

查看系統的umask
2016-08-01_17:50:00root@http://990487026.blog.51cto.com~/linux_c# umask
0022

為什麼是755?
0777 - 0022 == 0755

我把umask搞一下
2016-08-01_17:51:06root@http://990487026.blog.51cto.com~/linux_c# umask 0
2016-08-01_17:52:33root@http://990487026.blog.51cto.com~/linux_c# rm abc 
2016-08-01_17:52:40root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app 
3
2016-08-01_17:52:42root@http://990487026.blog.51cto.com~/linux_c# ll
total 16K
-rwxrwxrwx 1 root   root      0 Aug  1 17:52 abc*
-rwxrwxrwx 1 root   root   8.5K Aug  1 17:52 app*
-rw-rw-r-- 1 chunli chunli  239 Aug  1 17:51 main.c

main函數接收參數,調用open函數創建文件
2016-08-01_18:23:50root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
//linux api	man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	int ret = open(args[1],O_CREAT,0777);	//設置權限位為777
	printf("%d\n",ret);
	return 0;

}
2016-08-01_18:23:55root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
3
2016-08-01_18:24:03root@http://990487026.blog.51cto.com~/linux_c# ll
total 16K
-rwxr-xr-x 1 root   root      0 Aug  1 18:24 123*
-rwxr-xr-x 1 root   root   8.5K Aug  1 18:24 app*
-rw-rw-r-- 1 chunli chunli  406 Aug  1 18:23 main.c
2016-08-01_18:24:06root@http://990487026.blog.51cto.com~/linux_c# umask
0022
2016-08-01_18:24:10root@http://990487026.blog.51cto.com~/linux_c#

兩個參數的open函數,第三個參數從內存取垃圾值
2016-08-01_18:25:19root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
//linux api	man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	int ret = open(args[1],O_CREAT);	//設置權限位為777
	printf("%d\n",ret);
	return 0;

}

編譯運行:
2016-08-01_18:24:55root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
3
權限位很奇怪
2016-08-01_18:24:57root@http://990487026.blog.51cto.com~/linux_c# ll
---x--S--- 1 root   root      0 Aug  1 18:24 123*
-rwxr-xr-x 1 root   root   8.5K Aug  1 18:24 app*
-rw-rw-r-- 1 chunli chunli  401 Aug  1 18:24 main.c
2016-08-01_18:25:20root@http://990487026.blog.51cto.com~/linux_c# umask
0022

write()函數 向文件寫數據
2016-08-01_19:35:52root@http://990487026.blog.51cto.com~/linux_c# rm 123  app 
2016-08-01_19:35:56root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	//open函數返回文件描述符 0 1 2 =>STDIN STDOUT STDERR
	int fd = open(args[1],O_CREAT|O_RDWR,0644);	//創建文件可讀可寫
	char buf[] = "Hello World!\n";
	write(fd,buf,strlen(buf));	//寫到當前進程文件描述符為fd的文件
	printf("%d\n",fd);
	return 0;

}
2016-08-01_19:35:58root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
3
2016-08-01_19:36:01root@http://990487026.blog.51cto.com~/linux_c# cat 123 
Hello World!
2016-08-01_19:36:08root@http://990487026.blog.51cto.com~/linux_c#

write()函數的覆蓋操作 O_RDWR ,當open函數不需要create的時候,就不需要第3個函數
2016-08-01_19:40:53root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	//open函數返回文件描述符 0 1 2 =>STDIN STDOUT STDERR
	//int fd = open(args[1],O_CREAT|O_RDWR,0644);	//創建文件可讀可寫
	int fd = open(args[1],O_RDWR);	//創建文件可讀可寫
	char buf[] = "World!\n";
	write(fd,buf,strlen(buf));	//寫到當前進程文件描述符為fd的文件
	printf("%d\n",fd);
	return 0;

}

2016-08-01_19:39:27root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
3
2016-08-01_19:40:16root@http://990487026.blog.51cto.com~/linux_c# cat 123 
World!
orld!
2016-08-01_19:40:19root@http://990487026.blog.51cto.com~/linux_c#

open()函數文件的追加 _RDWR|O_APPEND
2016-08-01_19:42:36root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	//open函數返回文件描述符 0 1 2 =>STDIN STDOUT STDERR
	//int fd = open(args[1],O_CREAT|O_RDWR,0644);	//創建文件可讀可寫
	int fd = open(args[1],O_RDWR|O_APPEND,0644);	//創建文件可讀可寫
	//int fd = open(args[1],O_RDWR);	//創建文件可讀可寫
	char buf[] = "Linux haha !\n";
	write(fd,buf,strlen(buf));	//寫到當前進程文件描述符為fd的文件
	printf("%d\n",fd);
	return 0;

}
2016-08-01_19:42:37root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
3
2016-08-01_19:42:40root@http://990487026.blog.51cto.com~/linux_c# cat 123 
World!
orld!
Linux haha !
2016-08-01_19:42:43root@http://990487026.blog.51cto.com~/linux_c#

open(args[1],O_CREAT | O_RDWR | O_EXCL,0644) 創建文件,如果文件已經存在,就報錯
2016-08-01_19:49:44root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
	if(argc < 2)
	{
		printf("請輸入需要被創建的文件名\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	int fd = open(args[1],O_CREAT | O_RDWR | O_EXCL,0644);	//O_EXCL 如果文件已經存在,直接報錯
	char buf[] = "Linux haha !\n";
	write(fd,buf,strlen(buf));	//寫到當前進程文件描述符為fd的文件
	printf("%d\n",fd);
	return 0;

}
2016-08-01_19:49:45root@http://990487026.blog.51cto.com~/linux_c# ll
total 20K
-rw-r--r-- 1 root   root     26 Aug  1 19:42 123
-rwxr-xr-x 1 root   root   8.7K Aug  1 19:49 app*
-rw-rw-r-- 1 chunli chunli  705 Aug  1 19:49 main.c
2016-08-01_19:49:46root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
-1
2016-08-01_19:49:48root@http://990487026.blog.51cto.com~/linux_c#

測試一個程序最多能創建多少個文件,1021個,其他3個STDIN STDOUT STDERR已經存在了
2016-08-01_20:24:55root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
//	if(argc < 2)
//	{
//		printf("請輸入需要被創建的文件名\n");
//		exit(1);	//任何函數調用exit,程序直接退出
//	}

	char buf[10];
	int i = 0;
	while(1)
	{
		sprintf(buf,"file_%d",++i);
		int fd = open(buf,O_CREAT,0644);	//O_EXCL 如果文件已經存在,直接報錯
		if(fd == -1)
		{
			break;
		}
		else
		{
			printf("%d\t",i);
			if(i % 10 == 0)
			printf("\n");
			
		}
	}
	printf("\n");
	return 0;

}
2016-08-01_20:24:56root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
1	2	3	4	5	6	7	8	9	10	
11	12	13	14	15	16	17	18	19	20	
21	22	23	24	25	26	27	28	29	30	
31	32	33	34	35	36	37	38	39	40	
41	42	43	44	45	46	47	48	49	50	
51	52	53	54	55	56	57	58	59	60	
61	62	63	64	65	66	67	68	69	70	
71	72	73	74	75	76	77	78	79	80	
81	82	83	84	85	86	87	88	89	90	
91	92	93	94	95	96	97	98	99	100	
101	102	103	104	105	106	107	108	109	110	
111	112	113	114	115	116	117	118	119	120	
121	122	123	124	125	126	127	128	129	130	
131	132	133	134	135	136	137	138	139	140	
141	142	143	144	145	146	147	148	149	150	
151	152	153	154	155	156	157	158	159	160	
161	162	163	164	165	166	167	168	169	170	
171	172	173	174	175	176	177	178	179	180	
181	182	183	184	185	186	187	188	189	190	
191	192	193	194	195	196	197	198	199	200	
201	202	203	204	205	206	207	208	209	210	
211	212	213	214	215	216	217	218	219	220	
221	222	223	224	225	226	227	228	229	230	
231	232	233	234	235	236	237	238	239	240	
241	242	243	244	245	246	247	248	249	250	
251	252	253	254	255	256	257	258	259	260	
261	262	263	264	265	266	267	268	269	270	
271	272	273	274	275	276	277	278	279	280	
281	282	283	284	285	286	287	288	289	290	
291	292	293	294	295	296	297	298	299	300	
301	302	303	304	305	306	307	308	309	310	
311	312	313	314	315	316	317	318	319	320	
321	322	323	324	325	326	327	328	329	330	
331	332	333	334	335	336	337	338	339	340	
341	342	343	344	345	346	347	348	349	350	
351	352	353	354	355	356	357	358	359	360	
361	362	363	364	365	366	367	368	369	370	
371	372	373	374	375	376	377	378	379	380	
381	382	383	384	385	386	387	388	389	390	
391	392	393	394	395	396	397	398	399	400	
401	402	403	404	405	406	407	408	409	410	
411	412	413	414	415	416	417	418	419	420	
421	422	423	424	425	426	427	428	429	430	
431	432	433	434	435	436	437	438	439	440	
441	442	443	444	445	446	447	448	449	450	
451	452	453	454	455	456	457	458	459	460	
461	462	463	464	465	466	467	468	469	470	
471	472	473	474	475	476	477	478	479	480	
481	482	483	484	485	486	487	488	489	490	
491	492	493	494	495	496	497	498	499	500	
501	502	503	504	505	506	507	508	509	510	
511	512	513	514	515	516	517	518	519	520	
521	522	523	524	525	526	527	528	529	530	
531	532	533	534	535	536	537	538	539	540	
541	542	543	544	545	546	547	548	549	550	
551	552	553	554	555	556	557	558	559	560	
561	562	563	564	565	566	567	568	569	570	
571	572	573	574	575	576	577	578	579	580	
581	582	583	584	585	586	587	588	589	590	
591	592	593	594	595	596	597	598	599	600	
601	602	603	604	605	606	607	608	609	610	
611	612	613	614	615	616	617	618	619	620	
621	622	623	624	625	626	627	628	629	630	
631	632	633	634	635	636	637	638	639	640	
641	642	643	644	645	646	647	648	649	650	
651	652	653	654	655	656	657	658	659	660	
661	662	663	664	665	666	667	668	669	670	
671	672	673	674	675	676	677	678	679	680	
681	682	683	684	685	686	687	688	689	690	
691	692	693	694	695	696	697	698	699	700	
701	702	703	704	705	706	707	708	709	710	
711	712	713	714	715	716	717	718	719	720	
721	722	723	724	725	726	727	728	729	730	
731	732	733	734	735	736	737	738	739	740	
741	742	743	744	745	746	747	748	749	750	
751	752	753	754	755	756	757	758	759	760	
761	762	763	764	765	766	767	768	769	770	
771	772	773	774	775	776	777	778	779	780	
781	782	783	784	785	786	787	788	789	790	
791	792	793	794	795	796	797	798	799	800	
801	802	803	804	805	806	807	808	809	810	
811	812	813	814	815	816	817	818	819	820	
821	822	823	824	825	826	827	828	829	830	
831	832	833	834	835	836	837	838	839	840	
841	842	843	844	845	846	847	848	849	850	
851	852	853	854	855	856	857	858	859	860	
861	862	863	864	865	866	867	868	869	870	
871	872	873	874	875	876	877	878	879	880	
881	882	883	884	885	886	887	888	889	890	
891	892	893	894	895	896	897	898	899	900	
901	902	903	904	905	906	907	908	909	910	
911	912	913	914	915	916	917	918	919	920	
921	922	923	924	925	926	927	928	929	930	
931	932	933	934	935	936	937	938	939	940	
941	942	943	944	945	946	947	948	949	950	
951	952	953	954	955	956	957	958	959	960	
961	962	963	964	965	966	967	968	969	970	
971	972	973	974	975	976	977	978	979	980	
981	982	983	984	985	986	987	988	989	990	
991	992	993	994	995	996	997	998	999	1000	
1001	1002	1003	1004	1005	1006	1007	1008	1009	1010	
1011	1012	1013	1014	1015	1016	1017	1018	1019	1020	
1021	
2016-08-01_20:24:58root@http://990487026.blog.51cto.com~/linux_c#

通過ulimit命令也可以直接查詢最多可以創建多少文件
2016-08-01_20:26:24root@http://990487026.blog.51cto.com~/linux_c# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3823
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3823
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
2016-08-01_20:26:27root@http://990487026.blog.51cto.com~/linux_c#

修改ulimit -n 改變最大創建文件個數
2016-08-01_20:28:23root@http://990487026.blog.51cto.com~/linux_c# cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api	man 2 open
//open() and creat() return the new file descriptor, or -1 if an error occurred
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//linux api     man 2 close
#include <unistd.h>

int main(int argc,char **args)
{
//	if(argc < 2)
//	{
//		printf("請輸入需要被創建的文件名\n");
//		exit(1);	//任何函數調用exit,程序直接退出
//	}

	char buf[10];
	int i = 0;
	while(1)
	{
		sprintf(buf,"file_%d",++i);
		int fd = open(buf,O_CREAT,0644);	//O_EXCL 如果文件已經存在,直接報錯
		if(fd == -1)
		{
			break;
		}
		else
		{
			printf("%d\t",i);
			if(i % 20 == 0)
			printf("\n");
			
		}
	}
	printf("\n");
	return 0;

}
2016-08-01_20:28:26root@http://990487026.blog.51cto.com~/linux_c# ulimit -n 2000
2016-08-01_20:29:34root@http://990487026.blog.51cto.com~/linux_c# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3823
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3823
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
2016-08-01_20:29:38root@http://990487026.blog.51cto.com~/linux_c# 
2016-08-01_20:28:27root@http://990487026.blog.51cto.com~/linux_c# gcc -o app main.c  && ./app  123
1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17	18	19	20	
21	22	23	24	25	26	27	28	29	30	31	32	33	34	35	36	37	38	39	40	
41	42	43	44	45	46	47	48	49	50	51	52	53	54	55	56	57	58	59	60	
61	62	63	64	65	66	67	68	69	70	71	72	73	74	75	76	77	78	79	80	
81	82	83	84	85	86	87	88	89	90	91	92	93	94	95	96	97	98	99	100	
101	102	103	104	105	106	107	108	109	110	111	112	113	114	115	116	117	118	119	120	
121	122	123	124	125	126	127	128	129	130	131	132	133	134	135	136	137	138	139	140	
141	142	143	144	145	146	147	148	149	150	151	152	153	154	155	156	157	158	159	160	
161	162	163	164	165	166	167	168	169	170	171	172	173	174	175	176	177	178	179	180	
181	182	183	184	185	186	187	188	189	190	191	192	193	194	195	196	197	198	199	200	
201	202	203	204	205	206	207	208	209	210	211	212	213	214	215	216	217	218	219	220	
221	222	223	224	225	226	227	228	229	230	231	232	233	234	235	236	237	238	239	240	
241	242	243	244	245	246	247	248	249	250	251	252	253	254	255	256	257	258	259	260	
261	262	263	264	265	266	267	268	269	270	271	272	273	274	275	276	277	278	279	280	
281	282	283	284	285	286	287	288	289	290	291	292	293	294	295	296	297	298	299	300	
301	302	303	304	305	306	307	308	309	310	311	312	313	314	315	316	317	318	319	320	
321	322	323	324	325	326	327	328	329	330	331	332	333	334	335	336	337	338	339	340	
341	342	343	344	345	346	347	348	349	350	351	352	353	354	355	356	357	358	359	360	
361	362	363	364	365	366	367	368	369	370	371	372	373	374	375	376	377	378	379	380	
381	382	383	384	385	386	387	388	389	390	391	392	393	394	395	396	397	398	399	400	
401	402	403	404	405	406	407	408	409	410	411	412	413	414	415	416	417	418	419	420	
421	422	423	424	425	426	427	428	429	430	431	432	433	434	435	436	437	438	439	440	
441	442	443	444	445	446	447	448	449	450	451	452	453	454	455	456	457	458	459	460	
461	462	463	464	465	466	467	468	469	470	471	472	473	474	475	476	477	478	479	480	
481	482	483	484	485	486	487	488	489	490	491	492	493	494	495	496	497	498	499	500	
501	502	503	504	505	506	507	508	509	510	511	512	513	514	515	516	517	518	519	520	
521	522	523	524	525	526	527	528	529	530	531	532	533	534	535	536	537	538	539	540	
541	542	543	544	545	546	547	548	549	550	551	552	553	554	555	556	557	558	559	560	
561	562	563	564	565	566	567	568	569	570	571	572	573	574	575	576	577	578	579	580	
581	582	583	584	585	586	587	588	589	590	591	592	593	594	595	596	597	598	599	600	
601	602	603	604	605	606	607	608	609	610	611	612	613	614	615	616	617	618	619	620	
621	622	623	624	625	626	627	628	629	630	631	632	633	634	635	636	637	638	639	640	
641	642	643	644	645	646	647	648	649	650	651	652	653	654	655	656	657	658	659	660	
661	662	663	664	665	666	667	668	669	670	671	672	673	674	675	676	677	678	679	680	
681	682	683	684	685	686	687	688	689	690	691	692	693	694	695	696	697	698	699	700	
701	702	703	704	705	706	707	708	709	710	711	712	713	714	715	716	717	718	719	720	
721	722	723	724	725	726	727	728	729	730	731	732	733	734	735	736	737	738	739	740	
741	742	743	744	745	746	747	748	749	750	751	752	753	754	755	756	757	758	759	760	
761	762	763	764	765	766	767	768	769	770	771	772	773	774	775	776	777	778	779	780	
781	782	783	784	785	786	787	788	789	790	791	792	793	794	795	796	797	798	799	800	
801	802	803	804	805	806	807	808	809	810	811	812	813	814	815	816	817	818	819	820	
821	822	823	824	825	826	827	828	829	830	831	832	833	834	835	836	837	838	839	840	
841	842	843	844	845	846	847	848	849	850	851	852	853	854	855	856	857	858	859	860	
861	862	863	864	865	866	867	868	869	870	871	872	873	874	875	876	877	878	879	880	
881	882	883	884	885	886	887	888	889	890	891	892	893	894	895	896	897	898	899	900	
901	902	903	904	905	906	907	908	909	910	911	912	913	914	915	916	917	918	919	920	
921	922	923	924	925	926	927	928	929	930	931	932	933	934	935	936	937	938	939	940	
941	942	943	944	945	946	947	948	949	950	951	952	953	954	955	956	957	958	959	960	
961	962	963	964	965	966	967	968	969	970	971	972	973	974	975	976	977	978	979	980	
981	982	983	984	985	986	987	988	989	990	991	992	993	994	995	996	997	998	999	1000	
1001	1002	1003	1004	1005	1006	1007	1008	1009	1010	1011	1012	1013	1014	1015	1016	1017	1018	1019	1020	
1021	1022	1023	1024	1025	1026	1027	1028	1029	1030	1031	1032	1033	1034	1035	1036	1037	1038	1039	1040	
1041	1042	1043	1044	1045	1046	1047	1048	1049	1050	1051	1052	1053	1054	1055	1056	1057	1058	1059	1060	
1061	1062	1063	1064	1065	1066	1067	1068	1069	1070	1071	1072	1073	1074	1075	1076	1077	1078	1079	1080	
1081	1082	1083	1084	1085	1086	1087	1088	1089	1090	1091	1092	1093	1094	1095	1096	1097	1098	1099	1100	
1101	1102	1103	1104	1105	1106	1107	1108	1109	1110	1111	1112	1113	1114	1115	1116	1117	1118	1119	1120	
1121	1122	1123	1124	1125	1126	1127	1128	1129	1130	1131	1132	1133	1134	1135	1136	1137	1138	1139	1140	
1141	1142	1143	1144	1145	1146	1147	1148	1149	1150	1151	1152	1153	1154	1155	1156	1157	1158	1159	1160	
1161	1162	1163	1164	1165	1166	1167	1168	1169	1170	1171	1172	1173	1174	1175	1176	1177	1178	1179	1180	
1181	1182	1183	1184	1185	1186	1187	1188	1189	1190	1191	1192	1193	1194	1195	1196	1197	1198	1199	1200	
1201	1202	1203	1204	1205	1206	1207	1208	1209	1210	1211	1212	1213	1214	1215	1216	1217	1218	1219	1220	
1221	1222	1223	1224	1225	1226	1227	1228	1229	1230	1231	1232	1233	1234	1235	1236	1237	1238	1239	1240	
1241	1242	1243	1244	1245	1246	1247	1248	1249	1250	1251	1252	1253	1254	1255	1256	1257	1258	1259	1260	
1261	1262	1263	1264	1265	1266	1267	1268	1269	1270	1271	1272	1273	1274	1275	1276	1277	1278	1279	1280	
1281	1282	1283	1284	1285	1286	1287	1288	1289	1290	1291	1292	1293	1294	1295	1296	1297	1298	1299	1300	
1301	1302	1303	1304	1305	1306	1307	1308	1309	1310	1311	1312	1313	1314	1315	1316	1317	1318	1319	1320	
1321	1322	1323	1324	1325	1326	1327	1328	1329	1330	1331	1332	1333	1334	1335	1336	1337	1338	1339	1340	
1341	1342	1343	1344	1345	1346	1347	1348	1349	1350	1351	1352	1353	1354	1355	1356	1357	1358	1359	1360	
1361	1362	1363	1364	1365	1366	1367	1368	1369	1370	1371	1372	1373	1374	1375	1376	1377	1378	1379	1380	
1381	1382	1383	1384	1385	1386	1387	1388	1389	1390	1391	1392	1393	1394	1395	1396	1397	1398	1399	1400	
1401	1402	1403	1404	1405	1406	1407	1408	1409	1410	1411	1412	1413	1414	1415	1416	1417	1418	1419	1420	
1421	1422	1423	1424	1425	1426	1427	1428	1429	1430	1431	1432	1433	1434	1435	1436	1437	1438	1439	1440	
1441	1442	1443	1444	1445	1446	1447	1448	1449	1450	1451	1452	1453	1454	1455	1456	1457	1458	1459	1460	
1461	1462	1463	1464	1465	1466	1467	1468	1469	1470	1471	1472	1473	1474	1475	1476	1477	1478	1479	1480	
1481	1482	1483	1484	1485	1486	1487	1488	1489	1490	1491	1492	1493	1494	1495	1496	1497	1498	1499	1500	
1501	1502	1503	1504	1505	1506	1507	1508	1509	1510	1511	1512	1513	1514	1515	1516	1517	1518	1519	1520	
1521	1522	1523	1524	1525	1526	1527	1528	1529	1530	1531	1532	1533	1534	1535	1536	1537	1538	1539	1540	
1541	1542	1543	1544	1545	1546	1547	1548	1549	1550	1551	1552	1553	1554	1555	1556	1557	1558	1559	1560	
1561	1562	1563	1564	1565	1566	1567	1568	1569	1570	1571	1572	1573	1574	1575	1576	1577	1578	1579	1580	
1581	1582	1583	1584	1585	1586	1587	1588	1589	1590	1591	1592	1593	1594	1595	1596	1597	1598	1599	1600	
1601	1602	1603	1604	1605	1606	1607	1608	1609	1610	1611	1612	1613	1614	1615	1616	1617	1618	1619	1620	
1621	1622	1623	1624	1625	1626	1627	1628	1629	1630	1631	1632	1633	1634	1635	1636	1637	1638	1639	1640	
1641	1642	1643	1644	1645	1646	1647	1648	1649	1650	1651	1652	1653	1654	1655	1656	1657	1658	1659	1660	
1661	1662	1663	1664	1665	1666	1667	1668	1669	1670	1671	1672	1673	1674	1675	1676	1677	1678	1679	1680	
1681	1682	1683	1684	1685	1686	1687	1688	1689	1690	1691	1692	1693	1694	1695	1696	1697	1698	1699	1700	
1701	1702	1703	1704	1705	1706	1707	1708	1709	1710	1711	1712	1713	1714	1715	1716	1717	1718	1719	1720	
1721	1722	1723	1724	1725	1726	1727	1728	1729	1730	1731	1732	1733	1734	1735	1736	1737	1738	1739	1740	
1741	1742	1743	1744	1745	1746	1747	1748	1749	1750	1751	1752	1753	1754	1755	1756	1757	1758	1759	1760	
1761	1762	1763	1764	1765	1766	1767	1768	1769	1770	1771	1772	1773	1774	1775	1776	1777	1778	1779	1780	
1781	1782	1783	1784	1785	1786	1787	1788	1789	1790	1791	1792	1793	1794	1795	1796	1797	1798	1799	1800	
1801	1802	1803	1804	1805	1806	1807	1808	1809	1810	1811	1812	1813	1814	1815	1816	1817	1818	1819	1820	
1821	1822	1823	1824	1825	1826	1827	1828	1829	1830	1831	1832	1833	1834	1835	1836	1837	1838	1839	1840	
1841	1842	1843	1844	1845	1846	1847	1848	1849	1850	1851	1852	1853	1854	1855	1856	1857	1858	1859	1860	
1861	1862	1863	1864	1865	1866	1867	1868	1869	1870	1871	1872	1873	1874	1875	1876	1877	1878	1879	1880	
1881	1882	1883	1884	1885	1886	1887	1888	1889	1890	1891	1892	1893	1894	1895	1896	1897	1898	1899	1900	
1901	1902	1903	1904	1905	1906	1907	1908	1909	1910	1911	1912	1913	1914	1915	1916	1917	1918	1919	1920	
1921	1922	1923	1924	1925	1926	1927	1928	1929	1930	1931	1932	1933	1934	1935	1936	1937	1938	1939	1940	
1941	1942	1943	1944	1945	1946	1947	1948	1949	1950	1951	1952	1953	1954	1955	1956	1957	1958	1959	1960	
1961	1962	1963	1964	1965	1966	1967	1968	1969	1970	1971	1972	1973	1974	1975	1976	1977	1978	1979	1980	
1981	1982	1983	1984	1985	1986	1987	1988	1989	1990	1991	1992	1993	1994	1995	1996	1997	
2016-08-01_20:28:30root@http://990487026.blog.51cto.com~/linux_c#

最大最大能打開多少文件,取決於系統,據說是根據內存大小有關系
2016-08-01_20:31:00root@http://990487026.blog.51cto.com~/linux_c# cat /proc/sys/fs/file-max 
97372

read write 文件復制(非二進制)
2016-08-01_21:24:08chunli@http://990487026.blog.51cto.com~/linux_c$ cat main.c 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define SIZE 8192

int main(int argc,char **args)
{
	if(argc < 3)
	{
		printf("參數不夠\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	char buf[SIZE] = {0};
	int fd_src = 0;
	int fd_dest = 0;
	int len = 0;

	fd_src  =open(args[1],O_RDONLY);
	if(fd_src == -1)
	{
		printf("open(args[1],O_RDONLY) 文件打開失敗!\n");
		return fd_src;
	}

	fd_dest =open(args[2],O_CREAT | O_WRONLY | O_TRUNC,0755 );//創建文件,只寫,截斷
	if(fd_dest == -1)
	{
		printf("open(args[2],O_CREAT | O_WRONLY | O_TRUNC,0755 ) 文件打開失敗!\n");
		return fd_dest;
	}
	//成功返回督導的字符個數
	//讀到末尾返回0
	//讀失敗返回-1
	while(len = read(fd_src,buf,sizeof(buf)) ) 
	{
		write(fd_dest,buf,len);
	}
	return 0;
}
編譯運行
2016-08-01_21:24:11chunli@http://990487026.blog.51cto.com~/linux_c$ gcc main.c  -o app && ./app main.c  123

查看復制的效果怎麼樣
2016-08-01_21:24:13chunli@http://990487026.blog.51cto.com~/linux_c$ cat 123 
//C標准頭文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//linux api
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define SIZE 8192

int main(int argc,char **args)
{
	if(argc < 3)
	{
		printf("參數不夠\n");
		exit(1);	//任何函數調用exit,程序直接退出
	}
	char buf[SIZE] = {0};
	int fd_src = 0;
	int fd_dest = 0;
	int len = 0;

	fd_src  =open(args[1],O_RDONLY);
	if(fd_src == -1)
	{
		printf("open(args[1],O_RDONLY) 文件打開失敗!\n");
		return fd_src;
	}

	fd_dest =open(args[2],O_CREAT | O_WRONLY | O_TRUNC,0755 );//創建文件,只寫,截斷
	if(fd_dest == -1)
	{
		printf("open(args[2],O_CREAT | O_WRONLY | O_TRUNC,0755 ) 文件打開失敗!\n");
		return fd_dest;
	}
	//成功返回督導的字符個數
	//讀到末尾返回0
	//讀失敗返回-1
	while(len = read(fd_src,buf,sizeof(buf)) ) 
	{
		write(fd_dest,buf,len);
	}
	return 0;
}
2016-08-01_21:24:16chunli@http://990487026.blog.51cto.com~/linux_c$

阻塞演示:輸入輸出必須等待回應才能執行下一步
chunli@ubuntu:~/linux_c$ cat main.c 
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(void)
{
	int len  = 0;
	char buf[30] = {0};
	len = read(STDIN_FILENO,buf,sizeof(buf));
	write(STDOUT_FILENO,buf,len);
	return 0;
}

chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out 
hahaha
hahaha
chunli@ubuntu:~/linux_c$

非阻塞程序:
chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>	//exit
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>	//perror

#define MSG_TRY "try again \n"

int main(void)
{
	char buf[10] = {0};
	int fd = 0;
	int n = 0;
	fd = open("/dev/tty",O_RDONLY | O_NONBLOCK);
	if(fd < 0)
	{
		perror("open /dev/tty");
		exit(1);
	}
tryagain:
	n = read(fd,buf,sizeof(buf));
	if(n < 0)
	{
		if(errno == EAGAIN)
		{
			sleep(3);
			write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));
			goto tryagain;
		}
		perror("read /dev/tty");
		exit(2);
	}
	write(STDOUT_FILENO,buf,n);
	close(fd);
	return 0;
}
編譯運行:
chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out 
hello
try again 
hello
chunli@ubuntu:~/linux_c$

tty
chunli@ubuntu:~$ tty
/dev/pts/0

chunli@ubuntu:~$ who
chunli   pts/0        2016-08-02 10:35 (10.11.12.1)
chunli   pts/5        2016-08-02 08:56 (10.11.12.1)

chunli@ubuntu:~$ sudo echo `date` >>  /dev/tty
Tue Aug 2 11:35:06 CST 2016
chunli@ubuntu:~$

perror 報錯函數,全局變量errno,perrno去找這個數字,報出原因
chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>	//exit

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>	//perror

int main(void)
{
        int fd = open("123",O_WRONLY);
        if(fd<0)
        {
                printf("錯誤代碼是:%d\n",errno);
                perror("出錯啦");
                exit(-1);
        }

        return 0;
}

chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out 
錯誤代碼是:2
出錯啦: No such file or directory
chunli@ubuntu:~/linux_c$

打印出錯誤的原因
chunli@ubuntu:~/linux_c$ cat main.c 
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
        int fd = open("123",O_WRONLY);
        if(fd<0)
        {
                printf("錯誤代碼是:%d\n",errno);
		printf("打印出錯誤的原因%s \n",strerror(errno));
                //perror("出錯啦");
                exit(-1);
        }
        return 0;
}

chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out 
錯誤代碼是:2
打印出錯誤的原因No such file or directory 
chunli@ubuntu:~/linux_c$

Linux所有錯誤代碼
chunli@ubuntu:~/linux_c$ sudo find / -iname *errno-base* 
/usr/src/linux-headers-3.13.0-92/include/uapi/asm-generic/errno-base.h
/usr/src/linux-headers-3.19.0-25/include/uapi/asm-generic/errno-base.h

chunli@ubuntu:~/linux_c$ cat /usr/src/linux-headers-3.19.0-25/include/uapi/asm-generic/errno-base.h
#define	EPERM		 1	/* Operation not permitted */
#define	ENOENT		 2	/* No such file or directory */
#define	ESRCH		 3	/* No such process */
#define	EINTR		 4	/* Interrupted system call */
#define	EIO		 5	/* I/O error */
#define	ENXIO		 6	/* No such device or address */
#define	E2BIG		 7	/* Argument list too long */
#define	ENOEXEC		 8	/* Exec format error */
#define	EBADF		 9	/* Bad file number */
#define	ECHILD		10	/* No child processes */
#define	EAGAIN		11	/* Try again */
#define	ENOMEM		12	/* Out of memory */
#define	EACCES		13	/* Permission denied */
#define	EFAULT		14	/* Bad address */
#define	ENOTBLK		15	/* Block device required */
#define	EBUSY		16	/* Device or resource busy */
#define	EEXIST		17	/* File exists */
#define	EXDEV		18	/* Cross-device link */
#define	ENODEV		19	/* No such device */
#define	ENOTDIR		20	/* Not a directory */
#define	EISDIR		21	/* Is a directory */
#define	EINVAL		22	/* Invalid argument */
#define	ENFILE		23	/* File table overflow */
#define	EMFILE		24	/* Too many open files */
#define	ENOTTY		25	/* Not a typewriter */
#define	ETXTBSY		26	/* Text file busy */
#define	EFBIG		27	/* File too large */
#define	ENOSPC		28	/* No space left on device */
#define	ESPIPE		29	/* Illegal seek */
#define	EROFS		30	/* Read-only file system */
#define	EMLINK		31	/* Too many links */
#define	EPIPE		32	/* Broken pipe */
#define	EDOM		33	/* Math argument out of domain of func */
#define	ERANGE		34	/* Math result not representable */

文件lseek操作,擴展一個文件,需要一次寫操作
chunli@ubuntu:~/linux_c$ cat main.c 
// man 2 lseek
#include <stdio.h>
#include <stdlib.h>	//exit
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
	
	int fd = open("abc",O_RDWR);
	if(fd < 0)
	{
		perror("open abc ");
		exit(-1);
	}
	lseek(fd,0x1000,SEEK_SET);
	write(fd,"a",1);
	close(fd);
	return 0;	
}

chunli@ubuntu:~/linux_c$ 

chunli@ubuntu:~/linux_c$ touch abc
chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out
chunli@ubuntu:~/linux_c$ ls -l 
total 20
-rw-rw-r-- 1 chunli chunli 4097 Aug  2 15:59 abc
-rwxrwxr-x 1 chunli chunli 8805 Aug  2 15:59 a.out
-rw-rw-r-- 1 chunli chunli  347 Aug  2 15:59 main.c
chunli@ubuntu:~/linux_c$ 

用od 查看文件的內容
chunli@ubuntu:~/linux_c$ od -tc abc 
0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0010000   a
0010001
chunli@ubuntu:~/linux_c$

lseek獲取文件的大小

chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>	//exit
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

int main(void)
{
	
	int fd = open("abc",O_RDWR);
	if(fd < 0)
	{
		perror("open abc ");
		exit(-1);
	}
	lseek(fd,0x1000,SEEK_SET);
	write(fd,"a",1);
	close(fd);

	fd = open("main.c",O_RDWR);
	if(fd < 0)
	{
		perror("open hello");
		exit(-1);
	}
	printf("hello size = %ld\n",lseek(fd,0,SEEK_END));

	return 0;	
}

chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out
hello size = 485
chunli@ubuntu:~/linux_c$

fcntl獲取或者設置文件的訪問控制屬性
fcntl實例,以阻塞模式打開stdin,設置為非阻塞模式
chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>	//exit
#include <string.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define MSG_TRY "try again \n"

int main(void)
{
	char buf[100]= {0};
	int n  = 0;
	int flags;
	flags = fcntl(STDIN_FILENO,F_GETFL);
	flags |= O_NONBLOCK;
	if(fcntl(STDIN_FILENO,F_SETFL,flags) == -1)
	{
		perror("fcntl");
		exit(-1);
	}
tryagain:
	n = read(STDIN_FILENO,buf,sizeof(buf));
	if(n < 0)
	{
		if(errno == EAGAIN)
		{
			sleep(1);
			write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));
			goto tryagain;
		}
		perror("read stdin");
		exit(2);
	}
	write(STDOUT_FILENO,buf,n);
	return 0;
}

chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out
dadastry again 
d
try again 
dadasd
chunli@ubuntu:~/linux_c$

ioctl 獲取終端的行高 與 列寬
chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <sys/ioctl.h>
int main(void)
{
	struct winsize size;
	if(!isatty(STDOUT_FILENO))	//如果不是終端就退出
	{
		exit(1);
	}
	if(ioctl(STDOUT_FILENO,TIOCGWINSZ,&size) <0)
	{
		perror("ioctl TIOCGWINSZ error");
	}
	printf("行高%d\t列寬%d\n",size.ws_row,size.ws_col);
	return 0;
}
chunli@ubuntu:~/linux_c$ gcc main.c  && ./a.out
行高43	列寬173
chunli@ubuntu:~/linux_c$
【見圖】
ioctl獲取分辨率
chunli@ubuntu:~/linux_c$ cat main.c 
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <linux/fb.h>
int main(void)
{
	int fd;
	struct fb_var_screeninfo fb_info;
	fd = open("/dev/fb0",O_RDONLY);
	if(fd < 0)
	{
		perror("open /dev/fb0");
		exit(-1);
	}
	ioctl(fd,FBIOGET_VSCREENINFO,&fb_info);
	printf("tty分辨率是%d * %d \n",fb_info.xres,fb_info.yres);
	close(fd);
	return 0;
}
chunli@ubuntu:~/linux_c$ gcc main.c  &&  sudo ./a.out
tty分辨率是800 * 600 
chunli@ubuntu:~/linux_c$

習題
* 在系統頭文件中查找flags和mode參數用到的這些宏定義的值是多少。把這些宏定義按
位或起來是什麼效果?為什麼必選項只能選一個而可選項可以選多個?
* 請按照下述要求分別寫出相應的open調用。
打開文件/home/xingwenpeng/itcast.txt用於寫操作,以追加方式打開
打開文件/home/xingwenpeng/itcast.txt用於寫操作,如果該文件不存在則創建它
打開文件/home/xingwenpeng/itcast.txt用於寫操作,如果該文件已存在則截斷為0字
節,如果該文件不存在則創建它
打開文件/home/xingwenpeng/itcast.txt用於寫操作,如果該文件已存在則報錯退出,
如果該文件不存在則創建它
* 創建一個10M的空文件
* 實現輸出重定向,當C標准printf打印時,打印到你指定的test文件裡
* mycp拷貝命令實現。(思考如何拷貝目錄呢?)
* 獲取當前圖形界面的屏幕分辨率
本文出自 “魂斗羅” 博客,謝絕轉載!
Copyright © Linux教程網 All Rights Reserved