Compare commits
No commits in common. "560a59582315bebb345dfdc8a9baa098acaf2261" and "b8c6eeebaa13b52a067c3215db05d688f403f990" have entirely different histories.
560a595823
...
b8c6eeebaa
32
README.md
32
README.md
|
@ -198,44 +198,18 @@ ssize_t read(int fd, void *addr, size_t count);
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
int remove(const char *pathname); 【库函数】
|
int remove(const char *pathname);
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2.2 fcntl 函数
|
### 2.2 fcntl 函数
|
||||||
|
|
||||||
```c
|
```
|
||||||
// 修改标准的输入设备的标识为非阻塞
|
// 修改标准的输入设备的标识为非阻塞
|
||||||
int flags = fcntl(STDIN_FILENO, F_GETFL);
|
int flags = fcntl(STDIN_FILENO, F_GETFL);
|
||||||
flags |= O_NONBLOCK;
|
flags |= O_NONBLOCK;
|
||||||
fcntl(STDIN_FILENO, F_SETFL, flags);
|
fcntl(STDIN_FILENO, F_SETFL, flags);
|
||||||
```
|
```
|
||||||
|
|
||||||
取消非阻塞
|
|
||||||
|
|
||||||
```c
|
|
||||||
int flags = fcntl(STDIN_FILENO, F_GETFL);
|
|
||||||
flags ^= O_NONBLOCK;
|
|
||||||
fcntl(STDIN_FILENO, F_SETFL, flags);
|
|
||||||
```
|
|
||||||
|
|
||||||
获取文件的类型(文件、目录)
|
|
||||||
|
|
||||||
```
|
|
||||||
struct stat info;
|
|
||||||
|
|
||||||
stat(char *path, &info);
|
|
||||||
|
|
||||||
info.st_mode & S_IFDIR 是否为目录的验证
|
|
||||||
info.st_mode & S_IFREG 是否为文件的验证
|
|
||||||
```
|
|
||||||
|
|
||||||
打开目录和读取目录:
|
|
||||||
|
|
||||||
```
|
|
||||||
dir *opendir(char *path)
|
|
||||||
dirent *readdir(dir *)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.3 进程的定义
|
### 2.3 进程的定义
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -295,5 +269,5 @@ pid_t waitpid(pid_t pid, int *status, int options)
|
||||||
|
|
||||||
```
|
```
|
||||||
WIFEXITED(status) 如果子进程是正常终止的,取出的字段值非零
|
WIFEXITED(status) 如果子进程是正常终止的,取出的字段值非零
|
||||||
WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在 status 变量的 8~16 位(低位的第2个字节)。在用此宏前应先用宏 WIFEXITED 判断子进程是否正常退出,正常退出才可以使用此宏。
|
WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在 status 变量的 8~16 位。在用此宏前应先用宏 WIFEXITED 判断子进程是否正常退出,正常退出才可以使用此宏。
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
// 请分析如下程序,如何实现创建2个子进程, 第一个子进程输出ABC, 第二子进程输出 DEF。
|
|
||||||
// 做法二
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
// 创建2个子进程
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
pid_t pid = fork();
|
|
||||||
if (pid == 0)
|
|
||||||
{
|
|
||||||
if (i == 0)
|
|
||||||
printf("%d ABC\n", getpid());
|
|
||||||
|
|
||||||
else
|
|
||||||
printf("%d DEF\n", getpid());
|
|
||||||
|
|
||||||
_exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 等待所有子进程结束
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
// 等待任意子进程结束,并获取已终止子进程的进程ID
|
|
||||||
int pid = waitpid(-1, NULL, WUNTRACED); // -1 表示等待任意子进程
|
|
||||||
printf("子进程 %d over\n", pid);
|
|
||||||
if (pid == -1)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
printf("主进程 %d over\n", getpid());
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue