Compare commits

...

2 Commits

Author SHA1 Message Date
flykhan 560a595823 readme 系统调用, 进程(上) 2023-08-16 12:04:51 +08:00
flykhan 63a0e73009 day2: 作业8 写法二 2023-08-16 10:34:26 +08:00
2 changed files with 68 additions and 3 deletions

View File

@ -198,18 +198,44 @@ 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 进程的定义
``` ```
@ -269,5 +295,5 @@ pid_t waitpid(pid_t pid, int *status, int options)
``` ```
WIFEXITED(status) 如果子进程是正常终止的,取出的字段值非零 WIFEXITED(status) 如果子进程是正常终止的,取出的字段值非零
WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在 status 变量的 8~16 位。在用此宏前应先用宏 WIFEXITED 判断子进程是否正常退出,正常退出才可以使用此宏。 WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在 status 变量的 8~16 位低位的第2个字节。在用此宏前应先用宏 WIFEXITED 判断子进程是否正常退出,正常退出才可以使用此宏。
``` ```

39
day2/homework/h8_2.c Normal file
View File

@ -0,0 +1,39 @@
// 请分析如下程序如何实现创建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;
}