一、 实验目的
二、 实验任务与要求
三、 实验工具和环境
PC机、Linux Ubuntu操作系统。
四、 实验内容与结果
S_ISLNK(st_mode) 是否是一个链接文件;
S_ISREG (st_mode) 是否是一个普通文件;
S_ISDIR (st_mode) 是否是一个目录;
S_ISCHR (st_mode) 是否是一个字符设备;
S_ISBLK (st_mode) 是否是一个块设备;
S_ISFIFO (st_mode) 是否是一个管道文件;
S_ISSOCK (st_mode) 是否是一个SOCKET文件。
#include
#include
#include
#include
int main() {
struct stat st;
stat("/etc/passwd", &st);
if (S_ISDIR(st.st_mode)) {
printf("is dir!\n");
} else if (S_ISREG(st.st_mode)) {
printf("is file!\n");
} else {
printf("other! \n");
}
// ... 剩下的可以自行拓展
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
void print_mode(mode_t st_mode) {
putchar((S_ISDIR(st_mode)) ? 'd' : '-');
putchar((st_mode & S_IRUSR) ? 'r' : '-');
putchar((st_mode & S_IWUSR) ? 'w' : '-');
putchar((st_mode & S_IXUSR) ? 'x' : '-');
putchar((st_mode & S_IRGRP) ? 'r' : '-');
putchar((st_mode & S_IWGRP) ? 'w' : '-');
putchar((st_mode & S_IXGRP) ? 'x' : '-');
putchar((st_mode & S_IROTH) ? 'r' : '-');
putchar((st_mode & S_IWOTH) ? 'w' : '-');
putchar((st_mode & S_IXOTH) ? 'x' : '-');
}
void print_time(time_t time) {
char buf[80];
struct tm *tm = localtime(&time);
strftime(buf, sizeof(buf), "%b %e %H:%M", tm);
printf("%s", buf);
}
int main(int argc, char *argv[]) {
DIR *dp;
struct dirent *dirp;
struct stat statbuf;
struct passwd *pwd;
struct group *grp;
if ((dp = opendir(".")) == NULL) {
perror("opendir");
exit(1);
}
while ((dirp = readdir(dp)) != NULL) {
if (lstat(dirp->d_name, &statbuf) == -1) {
perror("lstat");
continue;
}
print_mode(statbuf.st_mode);
printf(" %lu ", statbuf.st_nlink);
if ((pwd = getpwuid(statbuf.st_uid)) != NULL)
printf("%s ", pwd->pw_name);
else
printf("%d ", statbuf.st_uid);
if ((grp = getgrgid(statbuf.st_gid)) != NULL)
printf("%s ", grp->gr_name);
else
printf("%d ", statbuf.st_gid);
printf("%5lld ", statbuf.st_size);
print_time(statbuf.st_mtime);
printf(" %s\n", dirp->d_name);
}
closedir(dp);
return 0;
}
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int sourceFile, destinationFile; //定义源文件和目标文件的文件描述符
ssize_t readBytes, writeBytes; //定义读取和写入的字节数
char buffer[1024]; //定义缓冲
sourceFile = open("sum.c", O_RDONLY); //打开源文件
if (sourceFile == -1) { //检查是否打开成功
perror("Error opening source file");
exit(EXIT_FAILURE);
}
destinationFile = open("tsum.c", O_WRONLY | O_CREAT | O_TRUNC, 0644); //打开目标文件
if (destinationFile == -1) { //检查是否打开成功
perror("Error opening destination file");
close(sourceFile); //关闭源文件
exit(EXIT_FAILURE);
}
while ((readBytes = read(sourceFile, buffer, sizeof(buffer))) > 0) { //循环读取源文件内容
writeBytes = write(destinationFile, buffer, readBytes); //将读取到的内容写入目标文件
if (writeBytes != readBytes) { //检查写入是否成功
perror("Error writing to destination file");
close(sourceFile); //关闭源文件
close(destinationFile); //关闭目标文件
exit(EXIT_FAILURE);
}
}
if (readBytes == -1) { //检查读取是否成功
perror("Error reading from source file");
close(sourceFile); //关闭源文件
close(destinationFile); //关闭目标文件
exit(EXIT_FAILURE);
}
close(sourceFile); //关闭源文件
close(destinationFile); //关闭目标文件
return 0;
}
#include
#include
#include
#define BUFFER_SIZE 1024
void cat(char *filename)
{
// 先读取并显示源文件
FILE *file = fopen(filename, "r"); // 打开文件
if (file == NULL)
{ // 检查是否打开成功
perror("Error opening file");
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE];
size_t readBytes;
while ((readBytes = fread(buffer, 1, BUFFER_SIZE, file)) > 0)
{ // 循环读取文件内容
fwrite(buffer, 1, readBytes, stdout); // 将读取到的内容输出到标准输出
}
fclose(file); // 关闭文件
}
void cp(char *sourceFileName, char *destinationFileName)
{
// 然后cp命令
FILE *sourceFile = fopen(sourceFileName, "r"); // 打开源文件
if (sourceFile == NULL)
{ // 检查是否打开成功
perror("Error opening source file");
exit(EXIT_FAILURE);
}
FILE *destinationFile = fopen(destinationFileName, "w"); // 打开目标文件
if (destinationFile == NULL)
{ // 检查是否打开成功
perror("Error opening destination file");
fclose(sourceFile); // 关闭源文件
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE];
size_t readBytes;
while ((readBytes = fread(buffer, 1, BUFFER_SIZE, sourceFile)) > 0)
{ // 循环读取源文件内容
fwrite(buffer, 1, readBytes, destinationFile); // 将读取到的内容写入目标文件
}
fclose(sourceFile); // 关闭源文件
fclose(destinationFile); // 关闭目标文件
}
int main(int argc, char *argv[])
{
char *sourceFileName = "source.txt";
char *destinationFileName = "dest.txt";
cat(sourceFileName);
cp(sourceFileName, destinationFileName);
return 0;
}
#include
#include
#include
#include
#include
#include
#include
typedef struct WAV
{
char riff[4];
long len;
char type[4];
char fmt[4];
char tmp[4];
short pcm;
short channel;
long sample;
long rate;
short framesize;
short bit;
char data[4];
long dblen;
} wav_t;
int main(int argc, char *argv[])
{
int fd = open("bird_free.wav", O_RDONLY); // 以二进制模式打开文件
if (fd == -1)
{ // 检查是否打开成功
printf("----- open err = %s \n", strerror(errno));
return -1;
}
char buf[4096];
wav_t *p = (wav_t *)buf;
int size = read(fd, p, sizeof(wav_t));
close(fd);
printf("---%s,%d,%d,%d\n", p->type, p->channel, p->sample, p->bit);
printf("---%d,%d\n", p->len, p->dblen);
return 0;
}
五、 实验总结