《那年,一步一步学linux c》全系列(目录索引)(转载)
c语言吧
全部回复
仅看楼主
level 10

楼主看到好东西,自然要和大家分享了[囧]
转载自:
http://blog.csdn.net/muge0913/article/details/7342977
我会不定期更新,当然基本每天都会更了
一起学习了,
[囧]

2012年09月13日 16点09分 1
level 10

介是目录
1、那年,一步一步学linux c ---getchar()详解
2、那年,一步一步学linux c ---getch()详解
3、那年,一步一步学linux c ---关于EOF
4、那年,一步一步学linux c ---关于静态链接库
5、那年,一步一步学linux c ---关于动态链接库
6、那年,一步一步学linux c ---windows下的链接库~~~
7、那年,一步一步学linux c ---华为面试题之extern
8、那年,一步一步学linux c ---华为面试题之Variable
9、那年,一步一步学linux c ---浅谈动态内存
10、那年,一步一步学linux c ---让系统更安全之锁定内存~~~
11、那年,一步一步学linux c ---内存映像~~那些事~~
12、那年,一步一步学linux c ---“侠肝义胆”之进程
13、那年,一步一步学linux c ---关于进程等待~
14、那年,一步一步学linux c ---退出进程~
15、那年,一步一步学linux c ---信号处理~
16、那年,一步一步学linux c ---信号具体含义解释~
17、那年,一步一步学linux c ---信号处理方法 && 实际应用~
18、那年,一步一步学linux c ---signal 和sigaction
19、那年,一步一步学linux c ---信号集及操作
20、那年,一步一步学linux c ---sigprocmask 阻塞进程
21、那年,一步一步学linux c ---sigsuspend 进程阻塞
22、那年,一步一步学linux c ---sigsuspend 执行过程分析
23、那年,一步一步学linux c ---raise
24、那年,一步一步学linux c ---alarm
25、那年,一步一步学linux c ---setitimer
26、那年,一步一步学linux c ---信号处理潜在危险!!!
27、那年,一步一步学linux c ---文件类型和属性
28、那年,一步一步学linux c ---linux文件组织信息
29、那年,一步一步学linux c ---网络编程之通信机制和体系结构模式
30、那年,一步一步学linux c ---socket实例
31、那年,一步一步学linux c ---undefined reference to ‘pthread_create'问题解决
32、那年,一步一步学linux c ---线程互斥实例
33、那年,一步一步学linux c ---底层终端编程实例
34、那年,一步一步学linux c ---共享内存通信实例
35、那年,一步一步学linux c ---消息队列实例
36、那年,一步一步学linux c ---文件操作
2012年09月13日 16点09分 2
level 10
今天先发俩,然后洗洗睡了[囧]
2012年09月13日 16点09分 3
level 10

1、那年,一步一步学linux c ---getchar()详解
getchar  函数名: getchar
  功 能: 从stdin流中读字符
  用 法: int getchar(void);
  注解:
  getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
  getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.
  程序例:
  #include <stdio.h>
  int main(void)
  {
  int c;
  /* Note that getchar reads from stdin and
  is line buffered; this means it will
  not return until you press ENTER. */
  while ((c = getchar()) != '\n')
  printf("%c", c);
  return 0;
  }
  注:可以利用getchar()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面,用法:在主函数结尾,return 0;之前加上getchar();即可
2012年09月13日 17点09分 4
level 10

2、那年,一步一步学linux c ---getch()详解
getch()   所在头文件:conio.h
函数用途:从控制台读取一个字符
函数原型:int getch(void)
返回值:读取的字符
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();会等待你按下任意键,再继续执行下面的语句;
用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
易错点:
1.所在头文件是conio.h。而不是stdio.h。
2.在使用之前要调用initscr(),结束时要调用endwin()。否则会出现不输入字符这个函数  也会返回的情况。
3.在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n)
1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。
getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。
2012年09月13日 17点09分 5
level 10
洗洗睡了[囧]
2012年09月13日 17点09分 6
level 9
兄弟,眼熟不?
2012年09月13日 17点09分 7
[囧]什么
2012年09月13日 17点09分
回复 沐在水中流 :独裁之剑吧,你很少去了啊。。。。。。
2012年09月13日 17点09分
回复 九重影999 :好像在哪见过你[囧]
2012年09月13日 17点09分
level 10
刚看完了第三节,EOF,明个,发帖[囧]
2012年09月13日 17点09分 8
level 11

2012年09月13日 17点09分 9
level 13
虽然感觉没什么特别,但技术贴要支持
————来自Nokia N9手机 MeeGo系统 不跟随,不抛弃,不妥协
2012年09月13日 22点09分 10
温习一下,加深下理解也好
2012年09月14日 01点09分
level 12
其实我还不太清楚linux和unix的区别[揉脸]只知道都是操作系统
也不知道linux到底有什么特别之处。好像是开源。
C语言在linux上的应用?
2012年09月14日 00点09分 11
linux下的c编程
2012年09月14日 01点09分
level 10

3、那年,一步一步学linux c ---关于EOF
EOF是 End Of File
的缩写。在C语言中,它是在标准库中定义的一个宏。
(1) 判断文件结束
多数人认为文件中有一个EOF,用于表示文件的结尾.
但这个观点实际上是错误的,在文
件所包含的数据中,并没有什么文件结束符.
对getc 而言, 如果不能从文件中读取,
则返回一个整数 -1,这就是所谓的EOF.
返回 EOF 无非是出现了两种情况,一是文件已
经读完;
二是文件读取出错,反正是读不下去了.
文件结束符EOF,Windows下为组合键Ctrl+Z,Unix/Linux下为组合键Ctrl+D
在linux中ctrl+c是程序结束命令就是向程序发送kill消息
一、getchar的两点总结:
1.当你输入一些有效数据时,最后加上enter键或ctrl+D键getchar才会从键盘缓冲区中读取数值。如下面程序段:
[cpp] view plaincopyprint?
while((c=getchar())!=EOF){
putchar(c);
} while((c=getchar())!=EOF){
putchar(c);
}
若是按enter键结束的,最后会打印出enter键当然此键是不可见的,并等待下次的输入。
若是按ctrl+D结束的,直接打印有效数据,并等待下次输入。
当你没有输入有效数据按下enter键会直接打印出enter键(当然这个键是不可见的),并再次等待下次的输入,直接按下ctrl+D键时,程序执行下面的程序代码,不在等待输入。
2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。
这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:
[cpp] view plaincopyprint?
charc;
c=getchar(); charc;
c=getchar();
这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不
正确的
。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R
C中特别提到了这个问题):
[cpp] view plaincopyprint?
intc;
c=getchar(); intc;
c=getchar();
二、EOF的两点总结(主要指普通终端中的EOF)
1.EOF作为文件结束符时的情况:
EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl+D(Windows下Ctrl+Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。
(1)遇到getcahr函数执行时,输入第一个字符时就直接输入Ctrl+D,就可以跳出getchar(),去执行程序的其他部分;
(2)在前面输入的字符为换行符时,接着输入Ctrl+D;
(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl+D,这时第二次输入的Ctrl+D起到文件结束符的功能,第一次的Ctrl+D使getchar开始读取键盘缓冲区中的数据。
其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl+D才相当于文件结束符。
2.EOF作为行结束符时的情况,这时候输入Ctrl+D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。
这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl+D,此时的Ctrl+D并不是文件结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl+D,程序输出结果为:

2012年09月14日 01点09分 12
表示这章有错误,下面就不看了,有错误的书害人,还是别急忙推荐
2012年09月14日 09点09分
回复 mr_sev :[囧]哪里错了
2012年09月14日 14点09分
回复 mr_sev :我根据上面讲的,测试过,并没有发现有什么错误。你说的错误在哪
2012年09月14日 15点09分
回复 沐在水中流 :linux中ctrl+c是发送sigint信号,并非sigkill信号。。。。。 虽然他们处理动作都是终止进程,但是sigint可以被捕捉,而sigkill是不能被捕捉的
2012年09月15日 02点09分
level 10
abcabc
注意:第一组abc为从终端输入的,然后输入Ctrl+D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl+D,则起到了文件结束符的作用,结束getchar()。
如果输入abc之后,然后回车,输入换行符的话,则终端显示为:
abc//第一行,带回车
abc//第二行
//第三行
其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。
从这里也可以看出Ctrl+D和换行符分别作为行结束符时,输出的不同结果。
EOF的作用也可以总结为:当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。
【补充】本文第二部分中关于EOF的总结部分,适用于终端驱动处于一次一行的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符
进行的。但是终端驱动处于一次一行的模式,它的输入只有到"\n"或者EOF时才结束,因此,终端上得到的输出也都是按行的。
如果要实现终端在读一个字符就结束输入的话,下面的程序是一种实现的方法(参考《C专家编程》,略有改动)
[cpp] view plaincopyprint?
#include<stdio.h>
#include<stdlib.h>
int
main(void)
{
intc;
/*终端驱动处于普通的一次一行模式 */
system("sttyraw");
/*现在的终端驱动处于一次一个字符模式 */
c=getchar();
putchar();
/*终端驱动处又回到一次一行模式 */
system("sttycooked");
return0;
} #include<stdio.h>
#include<stdlib.h>
int
main(void)
{
intc;
/*终端驱动处于普通的一次一行模式 */
system("sttyraw");
/*现在的终端驱动处于一次一个字符模式 */
c=getchar();
putchar();
/*终端驱动处又回到一次一行模式 */
system("sttycooked");
return0;
}
编译运行该程序,则当如入一个字符时,直接出处一个字符,然后程序结束。
由此可见,由于终端驱动的模式不同,造成了getchar()输入结束的条件不一样。普通模式下需要回车或者EOF,而在一次一个字符的模式下,则输入一个字符之后就结束了。
总结:EOF并不是存在于文件中的,而是一种状态,当读到文件末尾或者读取出错时就会返回这个值来判断文件结束。(即即使读取错误可能也被认为文件结束,所以就需要用feof
和 ferror来判断是不是真的文件结束了)
当用getchar(c)时,即使c定义成字符型,也可以结束,主要是c与-1比较时,c也会从char转换为整型值。
写个小程序验证了一下
[java] view plaincopyprint?
#include <stdio.h>
nt main()
{
char c;
c = -1;
printf("%x",c);
return 0;
} #include <stdio.h>
int main()
{
char c;
c = -1;
printf("%x",c);
return 0;
}
得到的结果为ffffffff,所以c即使定义为char型,读取文件等时还是能正常结束。
2012年09月14日 01点09分 13
level 1
你准备学习Linux c??
2012年09月14日 02点09分 14
系统都装好了
2012年09月14日 02点09分
回复 沐在水中流 :是刚刚开始学?还是已经是高手了?
2012年09月14日 02点09分
回复 lzqxs89 :刚学啊,新手,从windows转linux
2012年09月14日 02点09分
回复 沐在水中流 :那只是跨系统而已,我才开始学习C语言的
2012年09月14日 03点09分
level 7
坐等更新
2012年09月14日 03点09分 15
level 7
不错 顶顶 正要学LINUX下的C编程= =
2012年09月14日 03点09分 16
level 5
mark
2012年09月14日 06点09分 18
level 4
完全看不懂
2012年09月14日 15点09分 19
[来]加油,其实并不难
2012年09月14日 16点09分
回复 沐在水中流 :看这个之前是不是先看别的,不然真心看不懂。表示还在学C语言中。
2012年09月14日 16点09分
回复 淡定AI :先从基本的学吧,找本好书,推荐c primer plus,置顶贴里有,非常详细
2012年09月14日 16点09分
回复 沐在水中流 :我现在就在看这本书,找同学借的。
2012年09月14日 16点09分
level 10

楼主声明下,虽然是转载的,但楼主也认真看过,并在终端运行实验过的。
不会拿些自己看不懂,误人子弟的。
另外,里面一些笔误会尽量减少的。[Love]
2012年09月14日 16点09分 20
level 10

5、那年,一步一步学linux c ---关于动态链接库
在上篇文章中,是对静态链接库的介绍,其实有了上面的介绍动态链接库的制作就简单了,这篇来制作动态链接库~~~
创建动态链接库:
[cpp] view plaincopyprint?
#gcc –shared –Wall –fPIC bar.o foo.o –olibfoobar.so
查看动态链接库 和上次比 有发现没~~~~~~
[cpp] view plaincopyprint?
$ ldd foobar
linux-gate.so.1 => (0xffffe000)
libfoobar.so => /usr/lib/libfoobar.so (0xb7f58000)
libc.so.6 => /lib/libc.so.6 (0xb7e28000)
/lib/ld-linux.so.2 (0xb7f6f000)

2012年09月14日 16点09分 21
这章确实有错误,我已经把错误代码删了。
2012年09月14日 16点09分
1 2 尾页