Skip to content

Commit

Permalink
daemon and ttyname
Browse files Browse the repository at this point in the history
  • Loading branch information
54shady committed Jun 17, 2017
1 parent 400bb97 commit f20fa64
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 2 deletions.
34 changes: 32 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ echo bbb > tmp/2
rm tmp/3
```

##内核如何实现信号的捕捉
## 内核如何实现信号的捕捉
如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号.
由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下:

Expand All @@ -93,7 +93,7 @@ rm tmp/3
![kernel catch signal](./pngs/signal.png)


##使用二级指针巧妙删除链表节点
## 使用二级指针巧妙删除链表节点

```c
/*
Expand Down Expand Up @@ -121,9 +121,39 @@ void delete_plus(struct node *p)
## 进程
### 引言
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息
Linux内核的进程控制块是 task_struct 结构体,其中有如下信息
- 进程 id,系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一 个非负整数
- 进程的状态,有运行、挂起、停止、僵尸等状态
- 进程切换时需要保存和恢复的一些CPU寄存器
- 描述虚拟地址空间的信息
- 描述控制终端的信息
- 当前工作目录(Current Working Directory)
- umask 掩码
- 文件描述符表,包含很多指向file结构体的指针
- 和信号相关的信息
- 用户id和组id
- 控制终端、Session 和进程组
- 进程可以使用的资源上限(Resource Limit)
### 特点
- 在各自独立的地址空间中运行
- 共享数据需要mmap或者进程间通信机制
### 守护进程
概念: 没有控制终端,不能直接和用户交互,一直在运行着
#### 如何创建一个守护进程
创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader
## 线程
线程共享以下进程资源
Expand Down
49 changes: 49 additions & 0 deletions misc/daemon.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

/*
* 创建一个daemon的核心
* 调用fork,父进程退出,子进程调用setsid
*/
void daemonize(void)
{
pid_t pid;

/*
* Became a session leader to lose controlling TTY
*/
if (pid = fork() < 0)
{
perror("fork");
exit(1);
}
else if (pid != 0) /* parent */
exit(0);

/* Children call setsid */
setsid();

/*
* Change the curren working directory to the root
*/
if (chdir("/") < 0)
{
perror("chdir");
exit(1);
}

/*
* Attach file descriptors 0, 1, 2 to /dev/null
*/
close(0);
open("/dev/null", O_RDWR);
dup2(0, 1);
dup2(0, 2);
}

int main(int argc, char *argv[])
{
daemonize();
while (1);
}
16 changes: 16 additions & 0 deletions misc/ttyname.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <unistd.h>

/*
* 查看终端对应的设备文件名
* 在图形终端窗口下运行这个程序结果可能是/dev/pts/0
* 用 Ctrl-Alt-F1 切换到字符终端运行这个程序结果是/dev/tty1
*/

int main(int argc, char *argv[])
{
printf("fd 0 : %s\n", ttyname(0));
printf("fd 1 : %s\n", ttyname(1));
printf("fd 2 : %s\n", ttyname(2));
return 0;
}

0 comments on commit f20fa64

Please sign in to comment.