当前位置: 首页 > article >正文

使用C语言实现Linux的date>date.txt功能

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
    // 1. 打开文件 date.txt,如果文件不存在则创建,若存在则覆盖
    int fid = open("date.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fid == -1) {
        perror("open");
        exit(1);
    }

    // 2. 关闭标准输出(文件描述符 1)
    close(1);

    // 3. 将标准输出重定向到 fid(date.txt)
    dup(fid);

    // 4. 关闭原始的文件描述符 fid
    close(fid);

    // 5. 执行 "date" 命令
    execlp("date","date",(char *)NULL);

    // 如果 execlp 失败,输出错误
    perror("execlp");
    return 0;
}
        

 一些语句解惑:

———————————————————————————————————————————

在 C 语言及其他支持 POSIX 标准的编程语言中,exit(1) 是用来终止程序并向操作系统返回一个退出状态码 1 的函数调用。

exit 函数的作用

  1. 终止程序exit 函数会立刻结束当前程序的运行,并清理所有打开的文件描述符、释放资源等。
  2. 返回状态码:它会将指定的整数值作为退出状态码传递给调用程序(通常是操作系统或父进程)。

exit(1) 的具体含义

  • 1 表示程序异常退出:在大多数约定中,非零的退出状态码表示程序由于某种错误或问题而非正常退出。1 是常见的用于表示通用错误的状态码。
  • 约定俗成
    • exit(0):表示程序正常结束(没有错误)。
    • 非零值(如 exit(1):表示程序因某种错误或异常而退出。

———————————————————————————————————————————

在 C 语言中,perror 是一个用于输出最近一次系统调用或库函数出错信息的函数。它会将描述错误的消息输出到标准错误流(stderr),并附加上用户提供的提示信息。

———————————————————————————————————————————

execlp("date", "date", (char *)NULL); 是一个 C 语言中的系统调用,用于执行一个外部程序(在这个例子中是 date 命令)。它会用 date 命令替换当前进程,并将其输出执行。

解释各部分

  • execlp:这是一个系统调用,用于执行一个新的程序。它会用新的程序替换当前进程的映像。execlpexec 系列函数之一,专门用于查找并执行路径下的可执行文件。函数原型如下:

    int execlp(const char *file, const char *arg, ..., (char *)NULL);

    • file:要执行的命令的文件名,可以是相对路径或绝对路径。execlp 会在系统的 $PATH 环境变量指定的路径下查找该命令。
    • arg:传递给命令的参数,第一个参数通常是程序的名称(约定为 argv[0]),后续参数是传递给程序的其他命令行参数。
    • 最后的 (char *)NULL 是参数的结束标志,表示没有更多的命令行参数。
  • "date":这是传递给 execlp 的第一个参数,它指定要执行的程序。这里是 date 命令,通常用于显示当前的日期和时间。

  • "date":这是传递给 date 程序的第一个参数,通常 argv[0] 会是程序的名称。因此,"date" 作为程序名称传递给了它。

  • (char *)NULL:这是参数列表的结束标志,表示后面没有更多的命令行参数。这是 execlp 要求的格式。

工作原理

  • 当执行 execlp("date", "date", (char *)NULL); 时,当前进程会被替换为 date 命令。
  • execlp 会在系统的 $PATH 路径下查找 date 命令,并尝试执行它。如果找到并成功执行,它就会替换当前进程的映像,不会返回。
  • 如果执行成功,后续代码不会执行,因为当前进程已经被替换;如果失败,execlp 会返回 -1,并且设置 errno,你可以通过 perrorstrerror 查看具体的错误信息。

http://www.kler.cn/a/412898.html

相关文章:

  • 高级java每日一道面试题-2024年11月27日-JVM篇-JVM的永久代中会发生垃圾回收么?
  • CTF之密码学(培根密码)
  • JavaScript核心语法(3)
  • 一个专为云原生环境设计的高性能分布式文件系统
  • 充满智慧的埃塞俄比亚狼
  • Servlet细节
  • Vue2中 vuex 的使用
  • 嵌入式硬件实战基础篇(四)多路直流稳压电源
  • C#笔记(5)
  • Android实现桌面小部件:今天吃什么
  • 全文单词统计
  • Tomcat(38) Tomcat的响应缓冲区大小
  • UE5 纹理平铺
  • B+Tree--Mysql在插入(删除)是,节点(页)内有多个索引key,新索引key是怎么与其他key进行比较的呢?
  • 使用 Maven 开发 IntelliJ IDEA 插件
  • 蓝牙MCU单片机8k高回报率无线应用
  • HCIP——堆叠技术实验配置
  • Redis(4):主从复制
  • MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例
  • 3101.交替子数组计数
  • 2023年12月GESPC++一级真题解析
  • FFmpeg 音视频同步问题
  • 单片机将图片数组调出来显示MPU8_8bpp_Memory_Write
  • springboot视频网站系统的设计与实现(代码+数据库+LW)
  • 代码随想录打卡DAY20
  • C/C++基础知识复习(30)