现在的位置: 首页 > 综合 > 正文

linux 笔记

2012年08月20日 ⁄ 综合 ⁄ 共 4436字 ⁄ 字号 评论关闭

1有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径. 
还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep sin>~/sin (nm -s libpub.a可以知道这个.a文件中有哪些函数你可以使用)命令,然后看~/sin文件

2

Man 是很好的帮助系统,man 2 是系统调用man3是3表示函数是C的库函数

3系统还对进程区分了不同的状态.将进程分为新建,运行,阻塞,就绪和完成五个状态. 新建表示进程正在被创建,运行是进程正在运行,阻塞是进程正在等待某一个事件发生,就绪是表示系统正在等待CPU来执行命令,而完成表示进程已经结束了系统正在回收资源. 关于进程五个状态的详细解说我们可以看《操作系统》上面有详细的解说。 

4wait系统调用会使父进程阻塞直到一个子进程结束或者是父进程接受到了一个信号.如果没有父进程没有子进程或者他的子进程已经结束了wait回立即返回.成功时(因一个子进程结束)wait将返回子进程的ID,否则返回-1,并设置全局变量errno.stat_loc是子进程的退出状态.子进程调用exit,_exit 或者是return来设置这个值. 为了得到这个值Linux定义了几个宏来测试这个返回值. 

5struct passwd中的pw_passwd访问不了

6 当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的

7open函数有两个形式.其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面).flags可以去下面的一个值或者是几个值的组合. 
O_RDONLY:以只读的方式打开文件. 
O_WRONLY:以只写的方式打开文件. 
O_RDWR:以读写的方式打开文件. 
O_APPEND:以追加的方式打开文件. 
O_CREAT:创建一个文件. 
O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误. 
O_NOBLOCK:以非阻塞的方式打开一个文件. 
O_TRUNC:如果文件已经存在,则删除文件的内容. 
前面三个标志只能使用任意的一个.如果使用了O_CREATE标志,那么我们要使用open的第二种形式.还要指定mode标志,用来表示文件的访问权限.mode可以是以下情况的组合. 
S_IRUSR 用户可以读 S_IWUSR 用户可以写
S_IXUSR 用户可以执行 S_IRWXU 用户可以读写执行
S_IRGRP 组可以读 S_IWGRP 组可以写
S_IXGRP 组可以执行 S_IRWXG 组可以读写执行
S_IROTH         其他人可以读    S_IWOTH         其他人可以写
S_IXOTH         其他人可以执行  S_IRWXO         其他人可以读写执行
S_ISUID 设置用户执行ID  S_ISGID 设置组的执行ID
我们也可以用数字来代表各个位的标志.Linux总共用5个数字来表示文件的各种权限.
00000.第一位表示设置用户ID.第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,最后一位表示其他人的权限.
每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和.
比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件.设置用户ID位那么我们可以使用的模式是--1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省)5(1+4)即10705:
open("temp",O_CREAT,10705);

8

int mkdir(const char *path,mode_t mode);
DIR *opendir(const char *path);
struct dirent *readdir(DIR *dir);
void rewinddir(DIR *dir);
off_t telldir(DIR *dir);
void  seekdir(DIR *dir,off_t off);
int closedir(DIR *dir);

int dup2(int oldfd,int newfd);
dup2将用oldfd文件描述符来代替newfd文件描述符,同时关闭newfd文件描述符.也就是说,
所有向newfd操作都转到oldfd上面.下面我们学习一个例子,这个例子将标准输出重定向到一个文件.

9
time_ttime(time_t *tloc);
char *ctime(const time_t *clock);
time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中.不过这个函数的返回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2000 这个字符串的长度是固定的为26 

int gettimeofday(struct timeval *tv,struct timezone *tz);

10定时器

getitimer函数得到间隔计时器的时间值.保存在value中 setitimer函数设置间隔计时器的时间值为newval.并将旧值保存在oldval中. which表示使用三个计时器中的哪一个. itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后设置为it_interval值. int getitimer(int which,struct itimerval *value);
int setitimer(int which,struct itimerval *newval,
struct itimerval *oldval);

int kill(pid_t pid,int sig);
int raise(int sig);
unisigned int  alarm(unsigned int seconds);
11
kill系统调用负责向进程发送信号sig.
如果pid是正数,那么向信号sig被发送到进程pid.
如果pid等于0,那么信号sig被发送到所以和pid进程在同一个进程组的进程
如果pid等于-1,那么信号发给所有的进程表中的进程,除了最大的哪个进程号.
如果pid由于-1,和0一样,只是发送进程组是-pid.
我们用最多的是第一个情况.还记得我们在守护进程那一节的例子吗?我们那个时候用这个函数杀死了父进程守护进程的创建
raise系统调用向自己发送一个sig信号.我们可以用上面那个函数来实现这个功能的.
alarm函数和时间有点关系了,这个函数可以在seconds秒后向自己发送一个SIGALRM信号. 下面这个函数会有什么结果呢? 

12

int sigemptyset(sigset_t *set);
int  sigfillset(sigset_t *set);
int sigaddset(sigset_t *set,int signo);
int sigdelset(sigset_t *set,int signo);
int sigismember(sigset_t *set,int signo);
intsigprocmask(int how,const sigset_t *set,sigset_t *oset);
mask主要是为了屏蔽set集合中的信号,当参数how是SIG_BLOCK代表屏蔽,参数SIG_UNBLOCK代表的是不屏蔽
sigemptyset函数初始化信号集合set,将set设置为空.sigfillset也初始化信号集合,只是将信号集合设置为所有信号的集合.sigaddset将信号signo加入到信号集合之中,sigdelset将信号从信号集合中删除.sigismember查询信号是否在信号集合之中.
sigprocmask是最为关键的一个函数.在使用之前要先设置好信号集合set.这个函数的作用是将指定的信号集合set加入到进程的信号阻塞集合之中去,如果提供了oset那么当前的进程信号阻塞集合将会保存在oset里面.参数how决定函数的操作方式. 
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中. 
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合. 
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合. 

UNIX环境高级编程

1 STDIN_FILENO STDOUT_FILENO STDERROR_FILENO 的值分别是0、1、2

文件操作函数有:open creat read write lseek close

Open函数

Creat函数

现在open函数已经能够包含creat函数的功能,而且如果用creat创建一个文件并且先写后读的话,就必须按照这样的流程来,creat close open而open一个函数就搞定了

 

每一个打开的文件都有一个与其关联的“当前文件偏移量”

每当读取数据的时候,这个当前文件偏移量都会移动的,移动的字节是用户所读取的字节

Whence 的值有 SEEK_SET SEEK_CURSEEK_END

有的文件的文件偏移量,是不移动的,比如说管道,FIFO,网络套接字

文件的偏移量可以大于文件的长度,但是当下一次写操作发生时,将加长该文件并在文件中构成一个空洞,位于文件中但是没有写过的字节都被读成0

当一个进程往一个文件中写内容的时候,为什么该进程会输出显示呢?

Read返回nbytes表示文件正在读取中,而返回的ssize_t少于nbytes时候表示到文件结束了,在读文件的话,返回值就会变成0,所以判断一个文件是否读完,可以看返回值小于nbytes或者再度一次,返回值是0也代表文件已经读完,这样,返回值是-1表示出错,可以用strerror这个函数来看到底是什么错误,strerror(errno)。

 

 

 

抱歉!评论已关闭.