IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> unix环境高级编程学习笔记(一) -> 正文阅读

[系统运维]unix环境高级编程学习笔记(一)

图1-3 ls命令简单实现

#include "apue.h"
#include <dirent.h>

int main(int argc,char *argv[])
{
        DIR           *dp;
        struct dirent *dirp;

        //判断是否有路径
        if (argc != 2)
                err_quit("usage: ls directory_name");

        //判断路径是否存在
        if ((dp = opendir(argv[1])) == NULL)
                err_sys("can`t open %s",argv[1]);

        //循环判断是否为空,不为空输出目录名
        while ((dirp = readdir(dp)) != NULL)
                printf("%s\n", dirp->d_name);

        closedir(dp);
        exit(0);

}

在这里插入图片描述
C语言opendir()函数:打开目录函数
C语言readdir()函数:读取目录函数

图1-4 从标准输入读,并向标准输出写

#include "apue.h"

#define BUFFSIZE 4096

int main(void)
{
        int n;
        char buf[BUFFSIZE];

        while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
                if (write(STDOUT_FILENO, buf, n) != n)
                        err_sys("write error");

        if (n < 0)
                err_sys("read error");

        exit(0);

}

在这里插入图片描述
如果愿意从标准输入读,并向标准输出写,则图1.4的程序可用于复制任一UNIX普通文件

把输出的东西放到data文件里
在这里插入图片描述
在这里插入图片描述

图1.5 跟图1.4功能差不多一样

#include "apue.h"

int main(void)
{
        int c;
        
        while ((c = getc(stdin)) != EOF)
                if (putc(c, stdout) == EOF)
                        err_sys("output error");

        if (ferror(stdin))
                err_sys("input error");

        exit(0);
}

在这里插入图片描述
图1.5的程序也能复制任一UNIX普通文件
STDIN_FILENO的作用及与stdin 的区别

int ferror(FILE * stream);

The function ferror() tests the error indicator for the stream pointed to by stream, returning nonzero if it is set. The error indicator can be reset only by the clearerr() function.

函数ferror()用于测试所指向的流的错误指示器,如果设置了,则返回非零。误差指示器可以只能由clearerr()函数重置。

图1.6 打印进程ID

#include "apue.h"

int main(void)
{
        printf("hello world from process ID %ld\n",(long)getpid());
        exit(0);
}

在这里插入图片描述
调用了函数getpid得到进程id,getpid返回一个pid_t数据类型。我不知道它的大小,只知道标准会保证它能保存在一个long中。所以需要强制转换,虽然PID可以用int表示,但用long可以提高移植性。

图1.7 UNIX系统的进程控制功能简单的程序说明

#include "apue.h"
#include <sys/wait.h>

int main(void)
{
        char  buf[MAXLINE];
        pid_t pid;
        int   status;

        printf("%% ");
        while (fgets(buf, MAXLINE, stdin) != NULL)
        {
        		//因为execlp函数要求的参数是以null结束而不是以换行符结束。
                if (buf[strlen(buf) - 1] == '\n')
                        buf[strlen(buf) - 1] = 0;
                        
                //创建了个子进程
                if ((pid = fork()) < 0)
                {
                        err_sys("fork error");
                } else if (pid == 0){
                        execlp(buf, buf, (char *)0);
                        err_ret("couldn`t execute: %s", buf);
                        exit(127);
                }

                /* parent */
                if ((pid = waitpid(pid, &status, 0)) < 0)
                        err_sys("waitpid error");
                printf("%% ");
        }
        exit(0);
}

在这里插入图片描述
输入文件结束符(Ctrl + D)结束
EOF = -1
MAXLINE = 4096

从标准输入中读取一行数据到缓冲区buf中
原型 char * fgets(char * s, int n,FILE *stream);
参数:
s: 字符型指针,指向存储读入数据的缓冲区的地址。
n: 从流中读入n-1个字符
stream : 指向读取的流。

返回值:

  1. 当n<=0 时返回NULL,即空指针。
  2. 当n=1 时,返回空串"".
  3. 如果读入成功,则返回缓冲区的地址。
  4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

代码逻辑:
这是我理解的,有啥不对的指正一下,循环判断是否有输入,有输入放到buf里面,没输入就会一直等待不会进到循环里,第一个if是因为execlp函数要求的参数是以null结束而不是以换行符结束。第二个if是创建一个一个子进程,然后父进程等待子进程结束,子进程通过execlp 从PATH 环境变量中查找文件并执行,找到直接退出没有返回,没找到就err_ret打印,然后子进程退出,父进程继续等待输入。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-23 11:50:17  更:2021-09-23 11:50:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 16:37:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码