文件系统完结
This commit is contained in:
@@ -895,11 +895,77 @@ int getopt_long(int argc, char *const argv[], const char *optstring,
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 环境变量
|
### 环境变量
|
||||||
|
**KEY = VALVE**
|
||||||
|
可以通过`export`命令查看
|
||||||
|
|
||||||
|
```c
|
||||||
|
char *getenv(const char *name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* change or add
|
||||||
|
*
|
||||||
|
* @prarm: overwrite 是否覆盖
|
||||||
|
*
|
||||||
|
* 覆盖时是释放原来的空间,重新分配
|
||||||
|
*/
|
||||||
|
int setenv(const char *name, const char *value, int overwrite);
|
||||||
|
int unsetenv(const char *name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 和getenv一样的作用,change or add
|
||||||
|
* 用法不一样,且没有const修饰
|
||||||
|
*/
|
||||||
|
int putenv(char *string);
|
||||||
|
```
|
||||||
|
|
||||||
### C程序的存储空间布局
|
### C程序的存储空间布局
|
||||||
|
`pmap`命令,查看进程空间布局
|
||||||
|
|
||||||
### 库
|
### 库
|
||||||
|
- 动态库
|
||||||
|
- 静态库
|
||||||
|
- 手工装载库
|
||||||
|
```c
|
||||||
|
void *dlopen(const char *filename, int flag);
|
||||||
|
char *dlerror(void);
|
||||||
|
int dlclose(void *handle);
|
||||||
|
void *dlsym(void *handle, const char *symbol);
|
||||||
|
// Link with -ldl
|
||||||
|
```
|
||||||
|
|
||||||
### 函数之间正常的跳转
|
### 函数之间正常的跳转
|
||||||
|
`goto`无法跨函数跳转。
|
||||||
|
|
||||||
|
```c
|
||||||
|
/*
|
||||||
|
* 设置跳转点
|
||||||
|
*
|
||||||
|
* @return 0 说明是在设置跳转点
|
||||||
|
* @return 非0 说明是通过 longjmp 返回
|
||||||
|
*/
|
||||||
|
int setjmp(jmp_buf env);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 跳转到跳转点
|
||||||
|
*
|
||||||
|
* @prarm: env 跳转点
|
||||||
|
* @prarm: val 传递给 setjmp 的值
|
||||||
|
*/
|
||||||
|
void longjmp(jmp_buf env, int val);
|
||||||
|
```
|
||||||
|
|
||||||
### 资源的获取及控制
|
### 资源的获取及控制
|
||||||
|
`ulimit -a`
|
||||||
|
|
||||||
|
```c
|
||||||
|
// get/set resource limits
|
||||||
|
int getrlimit(int resource, struct rlimit *rlim);
|
||||||
|
int setrlimit(int resource, const struct rlimit *rlim);
|
||||||
|
|
||||||
|
// 普通用户不能设置超过硬限制
|
||||||
|
// root 用户可以 升高/降低 硬限制
|
||||||
|
struct rlimit {
|
||||||
|
rlim_t rlim_cur; /* soft limit */
|
||||||
|
rlim_t rlim_max; /* hard limit */
|
||||||
|
};
|
||||||
|
```
|
||||||
17
C13-Linux系统编程/fs/getenv.c
Normal file
17
C13-Linux系统编程/fs/getenv.c
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
|
||||||
|
puts(getenv("PATH"));
|
||||||
|
|
||||||
|
getchar();
|
||||||
|
/**
|
||||||
|
* ./getenv
|
||||||
|
* ps axf | grep getenv
|
||||||
|
* pmap 4938
|
||||||
|
*/
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
99
C13-Linux系统编程/fs/jmp.c
Normal file
99
C13-Linux系统编程/fs/jmp.c
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#include <setjmp.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
static jmp_buf save;
|
||||||
|
|
||||||
|
static void d(void)
|
||||||
|
{
|
||||||
|
printf("%s():Begin.\n", __FUNCTION__);
|
||||||
|
|
||||||
|
printf("%s():Jump now.\n", __FUNCTION__);
|
||||||
|
longjmp(save, 6);
|
||||||
|
// longjmp(save, 0); // !!! 如果返回0,实际会返回1,避免与另一种情况冲突
|
||||||
|
|
||||||
|
printf("%s():End.\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void c(void)
|
||||||
|
{
|
||||||
|
printf("%s():Begin.\n", __FUNCTION__);
|
||||||
|
printf("%s():Call d().\n", __FUNCTION__);
|
||||||
|
|
||||||
|
d();
|
||||||
|
|
||||||
|
printf("%s():d() returned.\n", __FUNCTION__);
|
||||||
|
printf("%s():End.\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void b(void)
|
||||||
|
{
|
||||||
|
printf("%s():Begin.\n", __FUNCTION__);
|
||||||
|
printf("%s():Call c().\n", __FUNCTION__);
|
||||||
|
|
||||||
|
c();
|
||||||
|
|
||||||
|
printf("%s():c() returned.\n", __FUNCTION__);
|
||||||
|
printf("%s():End.\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void a(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
printf("%s():Begin.\n", __FUNCTION__);
|
||||||
|
|
||||||
|
ret = setjmp(save);
|
||||||
|
if (0 == ret)
|
||||||
|
{
|
||||||
|
printf("%s():Call b().\n", __FUNCTION__);
|
||||||
|
b();
|
||||||
|
printf("%s():b() returned.\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s():Jumped back here with code %d.\n", __FUNCTION__, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s():End.\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief jmp
|
||||||
|
* @details
|
||||||
|
* d跳回a
|
||||||
|
*
|
||||||
|
* @param argc
|
||||||
|
* @param argv
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
printf("%s():Begin.\n", __FUNCTION__);
|
||||||
|
printf("%s():Call a().\n", __FUNCTION__);
|
||||||
|
|
||||||
|
a();
|
||||||
|
|
||||||
|
printf("%s():a() returned.\n", __FUNCTION__);
|
||||||
|
printf("%s():End.\n", __FUNCTION__);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ! out
|
||||||
|
// main():Begin.
|
||||||
|
// main():Call a().
|
||||||
|
// a():Begin.
|
||||||
|
// a():Call b().
|
||||||
|
// b():Begin.
|
||||||
|
// b():Call c().
|
||||||
|
// c():Begin.
|
||||||
|
// c():Call d().
|
||||||
|
// d():Begin.
|
||||||
|
// d():Jump now.
|
||||||
|
// a():Jumped back here with code 6.
|
||||||
|
// a():End.
|
||||||
|
// main():a() returned.
|
||||||
|
// main():End.
|
||||||
13
C13-Linux系统编程/fs/myenv.c
Normal file
13
C13-Linux系统编程/fs/myenv.c
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
extern char **environ;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int i = 0; environ[i] != NULL; i++)
|
||||||
|
puts(environ[i]);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user