gcc编译
安装build-essential软件包
$sudo apt-get install build-essential
编辑了一个c文件后,开始编译
gcc 文件名 -o 执行名字
./执行名字
gcc -c 表示只进行编译,不链接可执行
例子,编写实验。
c源码:
shu.c
make相关
被引用程序需要写.h文件。
|
|
makefile大致文件内容:
|
|
makefile规则:
|
|
文件操作
文件描述符,文件的标识符。0表示标准输入文件,1表示标准输出文件,2表示标准错误输出文件。
1、open函数
三个参数:路径名或文件名;打开方式,包括O_RDONLY,O_WRONLY,O_RDWR;
打开失败返回-1
管道方法(个人认为比较有用的):O_TRUNC、O_CREAT
头文件:#include
2、close函数
参数为fd,文件描述符
关闭文件,成功返回0,失败返回-1
头文件:#include
3、read函数
第一个参数文件描述符,第二个参数输入缓冲区指针(将指定文件内容输出到这里)相当于一个char类型的数组,第三个参数要输入的字节数。
成功时返回读取的字节数,失败返回-1
头文件:#include
4、write函数
第一个参数文件描述符,第二个参数(要写入文件的缓冲区),第三个参数一次写入的字节数。
成功时返回字节数,错误时返回-1
头文件:#include
5、creat函数
个人觉得并没有用…
6、lseek函数
第一个参数文件描述符,第二个参数偏移量,第三个参数是当前位置的基点。
SEEK_SET:开头
SEEK_CUR:当前
SEEK_END:末尾
头文件:#include
成功返回从文件开始到当前的偏移量,失败返回-1
7、ftruncate或者truncate函数
第一个参数文件名或路径或文件描述符(看是哪个函数)
成功返回0,失败返回-1
头文件:#include
注:argc与argv[]是有关命令行参数
以下是有关stat的详细信息
|
|
进程操作
进程的概念
具有一定功能的关于一个数据集合的一次运行活动,是处于活动状态的计算机程序。
linux的进程
每个进程用一个task_struct数据结构来表示,数组task包含指向系统所有task_struct结构的指针。最大512个。当前进程用current指针来指示。
每一个进程都要唯一的进程的识别号。(暂时不讲)关于进程调度我不知道有没有学的必要,先放一边。
进程控制
内核创建新进程:并不用fork,vfork调用,属于系统启动一部分。
一般来说,创建新进程,调用fork,vfork函数。
fork函数
创建子进程,完全复制父进程,与其共享数据段和堆栈区域。创建成功返回0,失败返回-1.
需要sys/types.h与unistd.h123456789101112#include<stdio.h>#include<sys/types.h>#include<unistd.h>int main(){pid_t pid;printf("start the testing");pid=fork();printf("create successfully!pid=%d",pid);return 0;}
以上例子创建了一个新的进程,并可看出,成功则返回0。pid是专门的 pid_t 类型,fork的返回值是 pid ,fork 无需参数 。
|
|
子进程执行完之后pid返回0,接着执行父进程返回pid。
- vfork函数
也是创建新的子进程。不过主要目的就是用exec调用另外的程序。在vfork使用exec或exit函数之前,子进程与父进程是共享数据段的。而fork是复制父进程。vfork调用exec或exit之前,子进程先运行,父进程挂起,如果需要父进程的进一步活动,则会造成死锁。
我感觉书上那个代码很弱智,就不写了。
- exec函数
用于系统调用,对进程执行新的目标程序。
exec函数会取代执行它的进程, 也就是说, 一旦exec函数执行成功, 它就不会返回了, 进程结束. 但是如果exec函数执行失败, 它会返回失败的信息(即-1), 而且进程继续执行后面的代码!
|
|
exec函数分为三个部分,文件名或者文件路径部分,参数部分,环境变量部分。
以上的函数定义是不是看起来很烦,我找到有个大佬总结了下,还挺舒服。
|
|
如果还是看着烦,就看例子吧。
execv()
execv(“/usr/bin/echo”,execv_str)可以看出只需要两个参数,一个路径名,一个数组,但是这个程序不要轻易尝试,原因试试就知道了。
execvp()
|
|
execvp(“echo”,execvp_str) 文件名加数组
举两个例子吧,大概能记住了吧。
fork()函数与exec()函数的联合使用
这个书上的例子还不错,我就把他打印下来。这是一个文件监控程序,修改后就建立一个副本,我觉得还是可以的。
|
|
system()函数
参数为一个指针。
指针为空返回1;
exec错误返回退出时的返回值;
调用成功返回shell的结束状态。
例子不举了,因为我要去洗头了。。
进程结束
三种正常结束:return exit _exit
两种异常结束
进程等待
就是将子进程挂起或者立即结束返回状态,若无子进程返回-1。
进程的用户标识号和进程标识号等之后再看吧,内容不多,暂时搁浅。