#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
函数的作用
- 终止程序:
exit
函数会立刻结束当前程序的运行,并清理所有打开的文件描述符、释放资源等。 - 返回状态码:它会将指定的整数值作为退出状态码传递给调用程序(通常是操作系统或父进程)。
exit(1)
的具体含义
1
表示程序异常退出:在大多数约定中,非零的退出状态码表示程序由于某种错误或问题而非正常退出。1
是常见的用于表示通用错误的状态码。- 约定俗成:
exit(0)
:表示程序正常结束(没有错误)。- 非零值(如
exit(1)
):表示程序因某种错误或异常而退出。
———————————————————————————————————————————
在 C 语言中,perror
是一个用于输出最近一次系统调用或库函数出错信息的函数。它会将描述错误的消息输出到标准错误流(stderr
),并附加上用户提供的提示信息。
———————————————————————————————————————————
execlp("date", "date", (char *)NULL);
是一个 C 语言中的系统调用,用于执行一个外部程序(在这个例子中是 date
命令)。它会用 date
命令替换当前进程,并将其输出执行。
解释各部分
execlp
:这是一个系统调用,用于执行一个新的程序。它会用新的程序替换当前进程的映像。execlp
是exec
系列函数之一,专门用于查找并执行路径下的可执行文件。函数原型如下: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
,你可以通过perror
或strerror
查看具体的错误信息。