一、标准I/O编程
标准I/O提供流缓冲的目的是尽可能减少使用read()和write()等系统调用的的数量。标准I/O提供了3中类型的缓冲存储。
1.全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。
2.行缓冲:在这种情况下,当在输入和输出中遇到行结束符时,标准I/O库执行I/O操作。标准输入和标准输出就是使用行缓冲的典型例子。
3.不带缓冲:标准I/O库不对字符进行缓冲。如果用标准I/O函数写若干字符到不带缓冲的流中,则相当于用系统调用write()函数将这些字符全写到被打开的文件上。标准出错stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来。
二、Linux进程
1.查进程
ps命令查找与进程相关的PID号:
ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps S 列出程序时,包括已中断的子程序资料。
ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。
2.杀进程
使用kill命令结束进程:kill xxx
常用:kill -9 324
Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:# killall -9 NAME
进程函数fork()
fork函数是程序中的分叉函数。
返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;
否则返回-1。
作用:正在执行的一个进程进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程。
函数原型:pid_t fork( void);
exec族函数
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。exec函数族的函数执行成功后不会返回,因为调用进程的实体被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,只有调用失败了才会返回一个-1,从原程序的调用点接着往下执行。
总结遇到的错误:
数组argv和envp忘记用NULL结束,程序会报错误。
exit()函数和_exit()函数
exit()就是退出程序,exit(0)表示正常退出,其他表示非正常退出exit(1)
_exit()用法跟上述一样,但是它们还是有细微的差别的。
exit与_exit的区别
_exit():直接使进程停止运行,清除其使用的内存空间。
exit():在执行退出之前加了若干道工序,在停止进行。
exit()函数在调用exit系统调用之前要检查文件,需要清理I/O缓冲。
waitpid()函数
函数作用:
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
函数原型:pid_t waitpid(pid_t pid,int * status,int options)
pid是一个标识符如果pid为-1就等待任何一个子进程,如果pid>0
就是等待pid指定的那个进程结束。
options是一个或多个标致符按位“或”的结果。可以用WNOHANG返回
status是一个int类型指针。