在Linux下用C语言编程
编辑器用vi或vim或emacs写,写完保存为**.c
然后用gcc编译,gdb调试。
比如gcc -o test.c test
-------------
运行 ./test
编译时只有加 -g 参数,才可用gdb调试。
如:gcc -g test.c -o test
一、工具篇
“公欲善其事,必先利其器”。编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具。
1、操作系统
在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD、RedHat Linux、SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等。
如果您一直使用Windows,身边又没有多余的机器安装UNIX,则可以使用VMware,通过VMware安装虚拟系统。
2、编译工具
目前绝大多数Unix或Lnux系统都提供CC或GCC编译器,最简单的cc命令格式如下:
cc -o hello hello.c
在unix shell环境中敲入上面的代码会将hello.c程序编译成可执行文件hello。
3、make工具
如 GNU make、System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同。
大部分UNIX和Linux程序都是通过运行make来编译的。
make工具会读取一个包含指令的文件(这个文件的名字通常都是 makefile 或 Makefile,不过后文中我们统一称之为 “makefile”),并执行各种操作来编译程序。
4、调试工具
最简单的调试工具:为你的程序添加打印语句,在你对程序的运行机制有了一定的了解后,你可以实用一些工具帮助你进行调试,当然你得学习一下这些工具得使用,如:dbx,gdb等。
还有一些内存工具可以帮你查找内存泄漏或缓冲区溢出等一些问题,如:memwatch,yamd等。
5、其他工具
1)vi或vim
Unix下文本编辑器。主要靠一堆命令来编辑文本文件,学Unix编程最好熟悉并熟练使用vi编辑器。
当然在实际工作中,你可能需要一个集成编码环境或一个功能强大的图形化编辑工具。
提供一个中文的vim在线手册:http://vcd.gro.clinux.org/
2)Secure shell/putty
一个支持ssh协议得客户端工具,多数情况下用来连接linux系统。
二、书籍篇
“书是人类进步得阶梯”。学习一门新的知识,当然要选择几本适合自己得书籍,下面介绍一些我自己学习C语言使用过的书籍:
1.《C primer plus》
推荐理由:适合作为入门书和基本函数查询得参考资料。本书最新版为第五版,以ANSI C99为标准详细介绍了C语言。
2.《The C programming_Language》
推荐理由:C语言之父得作品权威性毋庸置疑。虽然书籍出版时间比较老,好像也没更新,不过仍不失为经典书籍,网上有这本书得英文电子版提供下载。
3.《C 专家编程》
推荐理由:本书可以帮助有一定经验的C程序员成为C编程方面的专家,最关键的是本书寓教于乐,让你充分享受编程的乐趣。
4.《C缺陷与陷阱》
推荐理由:书中所揭示的知识能帮助您绕过C语言自身得陷阱和缺陷,减少代码中许多常见的Bug。
5.《unix环境高级编程》
推荐理由:既然是UNIX环境下C编程,就不得不说说UNIX编程书籍。
Stevens先生的《unix环境高级编程》是我竭力推荐的,也是我的案头必备(如果对网络编程有兴趣的,可以学习一下Stevens先生的《UNIX网络编程》两卷,如果觉得还不过瘾,可以再看看《TCP/IP详解》三卷)。
6.《计算机编程艺术》
推荐理由:算法大师得呕心沥血之作。计划出版五卷书,目前好像已出版3卷。对算法有兴趣得可以研究一下。
三、过程篇
1.学习C语法
语法的学习对于一个具有编程底子的来说,就很轻松了;即使你以前没有学习过其他编程语言,我相信有2个星期,你也能轻松搞定。
需要注意的是,不要太纠缠于语言的细节,比如:运算符优先级与结合性的问题等。
2.学习C标准库
ANSI C库把函数分为不同的组,每个组都具有与之相关的头文件。C语言标准库相对于其他语言,比如C++,Java来说是非常短小精悍的,但首先应着重对以下库进行学习:
ctype.h:字符处理
math.h:数学库
stdio.h:标准I/O库
stdlib.h:通用工具库
string.h:字符串处理
time.h:时间和日期
如果想了解完成的ANSI C库,你可以购买相关的书籍,这些书籍一般会详细介绍每个函数的用户和一些注意点;当然你也可以登陆http://www.dinkumware.com/manual ... amp;page=index.html获取ANSI C库详细信息。
3.攻克C的难点
1)C语言声明:
C语言的声明确实让我觉得恐怖,比较晦涩难懂,而且声明的形式和使用的形式还类似。比如如下的声明恐怕就连很多熟悉C多年的程序员也不是一眼就能看出来的:
char * const * (*next)();
那么有没有一种好的记忆方法或规则来搞清楚呢,好像没有,如果有的话也不是这样折磨人了。不过可以看看《C专家编程》第三章的内容,或许你会有所收获。
也只能多学多练了,所谓熟能生巧嘛,希望这个问题不要在你的心灵上留下阴影。
2)数组与指针:
数组与指针的关系,在标准中并没有作很详细的规定,而且好多C入门的书籍在这个问题上并没有给出很详细的说明,所以会给人造成很多误解。
对于这个问题,你可以参考《C缺陷与陷阱》4.5节和《C专家编程》第4,9,10章,相信你这里面的内容搞透彻,以后就不会再被这个问题搞迷惑。
3)指针与内存:
如果你以后编写规模较大的程序,你可能发现这个问题可能会是你最大的烦恼,而且可能会是你消耗最多调试时间的事项。
4)C版本的问题:
你得特别小心该问题,最好不要在你的程序中混合使用不同版本C的特性,否则会给你带来很迷惑的问题。如果一定要用,你最好清楚自己在做什么。
还有一些其他C中的难点和容易错误的地方,可以学习前人的一些经验。以下是一个c FAQ的链接地址,相信在这篇文档中有你需要的大部分问题的解决方法。
http://c-faq-chn.sourceforge.net/
4. UNIX环境编程
学习了以上内容之后,我相信,你就可以进行unix环境编程了。不过你可能需要对操作系统理论有一点点的了解,这样学起来会比较轻松一些。
Unix环境编程,你应该着重IO和进程两大块内容。
《Unix环境高级编程》中对Unix环境编程有着非常详细且深入的论述,而且书中有大量实用性例子程序,不过可能得花上几个月得时间,好好啃一啃了。
在扎实掌握以上内容,不代表你得C语言学习支路已经完成,相反,才刚刚开始。以后你需要用学到得知识去解决大量不同实际问题,在不断得实践过程中,你会近一步加深对C的理解。有了以上基础之后,你会发现,在实践过程中需要的其他知识,你会非常快速的掌握。
如果你在DOS时代编写过程序,那么你也许知道在DOS下为了编写一个常驻内存的程序我们要编写多少代码了.相反如果在Linux下编写一个"常驻内存"的程序却是很容易的.我们只要几行代码就可以做到. 实际上由于Linux是多任务操作系统,我们就是不编写代码也可以把一个程序放到后台去执行的.我们只要在命令后面加上&符号SHELL就会把我们的程序放到后台去运行的. 这里我们"开发"一个后台检查邮件的程序.这个程序每个一个指定的时间回去检查我们的邮箱,如果发现我们有邮件了,会不断的报警(通过机箱上的小喇叭来发出声音). 后面有这个函数的加强版本加强版本
后台进程的创建思想: 首先父进程创建一个子进程.然后子进程杀死父进程(是不是很无情?). 信号处理所有的工作由子进程来处理.
#include
#include
#include
#include
#include
#include
#include
/* Linux 的默任个人的邮箱地址是 /var/spool/mail/用户的登录名 */
#define MAIL "/var/spool/mail/hoyt"
/* 睡眠10秒钟 */
#define SLEEP_TIME 10
main(void)
{
pid_t child;
if((child=fork())==-1)
{
printf("Fork Error:%s\n",strerror(errno));
exit(1);
}
else if(child>0)
while(1);
if(kill(getppid(),SIGTERM)==-1)
{
printf("Kill Parent Error:%s\n",strerror(errno));
exit(1);
}
{
int mailfd;
while(1)
{
if((mailfd=open(MAIL,O_RDONLY))!=-1)
{
fprintf(stderr,"%s","\007");
close(mailfd);
}
sleep(SLEEP_TIME);
}
}
}
你可以在默认的路径下创建你的邮箱文件,然后测试一下这个程序.当然这个程序还有很多地方要改善的.我们后面会对这个小程序改善的,再看我的改善之前你可以尝试自己改善一下.比如让用户指定邮相的路径和睡眠时间等等.相信自己可以做到的.动手吧,勇敢的探险者.
好了进程一节的内容我们就先学到这里了.进程是一个非常重要的概念,许多的程序都会用子进程.创建一个子进程是每一个程序员的基本要求!
#include <unistd.h>;
#include <sys/types.h>;
#include <sys/stat.h>;
#include <stdio.h>;
#include <errno.h>;
#include <fcntl.h>;
#include <signal.h>;
/* Linux 的默任个人的邮箱地址是 /var/spool/mail/用户的登录名 */
#define MAIL "/var/spool/mail/hoyt"
/* 睡眠10 秒钟 */
#define SLEEP_TIME 10
main(void)
{
pid_t child;
if((child=fork())==-1)
{
printf("Fork Error:%s\n",strerror(errno));
exit(1);
}
else if(child > 0)
while(1);
if(kill(getppid(),SIGTERM)==-1)
{
printf("Kill Parent Error:%s\n",strerror(errno));
exit(1);
}
{
int mailfd;
while(1)
{
if((mailfd=open(MAIL,O_RDONLY))!=-1)
{
fprintf(stderr,"%s","\007");
close(mailfd);
}
sleep(SLEEP_TIME);
}
}
}
linuxc语言编译linuxc语言编译
link:链接器,它负责将汇编器输入的机器码和库打包成一个操作系统可以运行的可执行文件,在Linux上的可执行文件格式是ELF格式,这个格式的实现是有链接器来完成的。VisualStudio2019怎么编译C语言源程序?步骤如下 1.打开VS2019主程序,选择创建新项目 2.筛选菜单栏中选择C++,Windows,所有项目类型,选择...
Linux中,运行一个C语言程序如何运行
在Linux中,可以使用gcc编译器编译C语言程序,生成可执行文件,并最终执行。具体步骤如下:1、编译。由.c文件生成.o文件,写作:gcc a.c -o a.o -c这个命令可以将a.c编译成a.o。如果存在多个文件,可以逐个编译,即a.c b.c...生成a.o b.o...等。2、链接。由.o文件生成可执行文件,...
嵌入式Linux上的C语言编程实践目录
第8章 Linux中C语言的扩展库函数 进一步探讨Linux环境下的C语言扩展库函数,包括文件I\/O操作、文件权限管理、用户组操作、信号处理、进程控制、内存映射等。第四部分 C语言高级编程 第9章 动态内存的堆与栈 深入解析程序内存区域的使用,包括静态与动态内存、栈空间特性、堆空间使用与比较。第10章 函数...
linux为什么用c语言
C编译的机器码运行效率高,同时C源码可以模拟面向对象的写法。总的来说,C是各方面比较均衡的语言,很适合编写操作系统这种既注重性能又规模庞大的软件。另外,Linux内核也不全是用C语言写的,与平台有关的部分,必要时采用相应平台的汇编语言来写。
怎么在linux中编写c语言程序
首先需要有一个安装好gcc的Linux系统,然后进行代码的编写进行测试演示 工具:Ubuntu12.04 步骤 进入Linux系统后,启动一个shell命令终端,在Ubuntu的三键启动终端方法是同时按下Ctrl键+Alt键+t 启动后如下图所示:在终端下敲入命令 gedit helloworld.c 后按下回车键。这个命令会用gedit软件打开文件名为...
linux编程linux和编程
linux语言和c语言比哪个难度大?学会linux比学会C语言要容易很多。但是必须指出的是linux是操作系统,而c语言是编程语言。他们两个是不一样的东西。C语言可以在linux下面使用,各个版本的linux都支持C语言,并且都自带了C语言的编译程序。只需要学会简单的linux操作,就可以使用C语言编程了。相对来说,学会...
在linux环境下如何用C语言编程?代码在那里写呢,写完保存成什么格式的呢...
编辑器用vi或vim或emacs写,写完保存为**.c 然后用gcc编译,gdb调试。比如gcc -o test.c test --- 运行 .\/test 编译时只有加 -g 参数,才可用gdb调试。如:gcc -g test.c -o test
linux下的c语言编程和windows下的c语言编程有什么区别
语言本身差别不大。主要主要是和系统交互的时候不同。一个是Linux的POSIX接口,一个是Windows的Win32 API。Linux下的接口因为源自UNIX,有很多API明显是C库的风格,风格比较老旧。但是Win32 API风格更现代、更高级一些。比如Linux下fork\/exec、Windows下CreateProcess。而且Windows的API提供很多图形界面的相关...
linux下的C语言编程与windows下的C语言编程都是同一种语言吗?从语法上...
没有区别,C语言是有标准的,叫做C语言的必须符合国际标准。区别在于Windows通过头文件windows.h提供的Windows API函数,而Linux则提供了它自己的函数。基本的C库函数,如stdio.h,string.h等也是标准化的,所有C编译器都必须提供这些函数,典型的如printf, strcpy等。问题是在于,如果你要调用系统功能,...
想在LINUX下学习C语言,该如何开始?
提供一个中文的vim在线手册:http:\/\/vcd.gro.clinux.org\/ 2)Secure shell\/putty 一个支持ssh协议得客户端工具,多数情况下用来连接linux系统。二、书籍篇 “书是人类进步得阶梯”。学习一门新的知识,当然要选择几本适合自己得书籍,下面介绍一些我自己学习C语言使用过的书籍:1.《C primer plus》推...
溥惠碘帕: linux终端下,编译C语言程序步骤为:采用vi进行源代码编写,编写完成后,:wq存盘退出,如:vi test.c 在命令行下,运行gcc编译程序,生成执行码,如:gcc -o test test.c-o 表示指明生成的执行码名称 运行编译后的执行码./test
安徽省19712279081: 在Linux系统中,如何运行一个C语言程序? - ?
溥惠碘帕: 我不太明白你说的是什么意思,Linux下的C编程一般是通过gcc实现的. 例如,创建了一个hello.c文本,在文本中写入 #include <stdio.h>int main(void){printf(“hello world!!”);return 0;}然后在终端输入$ gcc –o hello hello.c$ /tmp/hello 注:hello.c文件放在/tmp目录下,通过gcc -o hello hello.c命令生成一个hello文件,它是一个可执行文件,然后直接执行,就可以运行该程序了.
安徽省19712279081: 如何在linux中运行c程序 - ?
溥惠碘帕: gcc first.C -o first 说明: 1>编译当前目录下、名字叫做first.C的c源文件; 2>在当前目录下、生成名字叫first(这个名字可以自己随便写、符合linux命名规则就行)的可执行程序;关于运行: 用ls -l 命令,可以看到当前目录下有一个绿色的文件、名字叫first,就是刚刚编译得到的文件; 使用命令“./first”既可运行(无双引号、双引号是用来说明的);
安徽省19712279081: 到底怎么在Linux里编写c程序啊? - ?
溥惠碘帕: 在linux下通常使用gedit或vim直接编写.c程序,然后通过gcc指令编译.以Ubuntu系统为例,详细过程如下: 1、进入桌面Temp文件夹 2、右键新建空白文件 3、将文件命名为hello.c 4、进入hello.c,开始编写代码(默认gedit为编辑器) ...
安徽省19712279081: linux系统怎么c语言编程 - ?
溥惠碘帕: 比如编写一个C语言文件 1.cpp 【建议使用gedit,可以使用中文哦】 然后简单方法就是:g++ 1.cpp 然后./a.out 稍微麻烦点就是 g++ 1.cpp -o out./out
安徽省19712279081: C语言如何在LINUX下编写??
溥惠碘帕: 首先要安装编译工具,一般是GCC 还有其他的工具,写代码都是用VI VIM这些文本编辑器.完成后保存为C语言文件.在GCC环境下进行编译
安徽省19712279081: 如何在Linux环境下进入C语言编程??
溥惠碘帕: 没有什么进入C语言编程的. 先用编辑器(vim,Emacs)写好源代码,再gcc编译. 如,你要写一个hello程序, vim hello.c 进入编辑环境 gcc hello.c -o hello 写好源代码gcc编译(相关的详细应用baidu,google一下) 前提要会用vim和安装好gcc编译环境. 运行程序就是,在文件所在的目录下指令./hello
安徽省19712279081: 怎么在linux上用C语言编程,用什么软件 - ?
溥惠碘帕: 编译器使用g++ 编辑器使用VI, Emacs 自动化工具使用automake 和Makefile IDE使用Eclipse, Qt, KDevelop等.
安徽省19712279081: linux环境下用c语言编程 - ?
溥惠碘帕: 1 2 3 4 5 6 7 8 9 10 11 12 13#include <stdio.h>intmain() {intsum=0;inti;for(i=50;i<=100;i++)sum += i;printf("my name is zhang san, sum=%d\n", sum); }编译:gcc xx.c (xx.c为文件名) 生成a.out 执行:./a.out
安徽省19712279081: Linux 下的C语言编程 - ?
溥惠碘帕: #include<stdio.h> main() {int p1,p2; printf("in parent when no child\n"); system("ps -af"); while ((p1=fork())==-1); if(p1==0) {printf("hello I am the first child!\n"); printf("in child1:pid:%d,ppid:%d\n",getpid(),getppid()); system("ps -af");} else ...