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

发布于:2024-11-28 ⋅ 阅读:(27) ⋅ 点赞:(0)

#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 查看具体的错误信息。