string.h,signal.h,fcntl.h ,terrnios.h,timer.h,sigcontext.h,stat.h

本文详细介绍了C语言中几个关键头文件的功能与用途,包括string.h中的字符串操作函数,signal.h中的信号处理,fcntl.h中的文件描述符操作,以及terrniios.h、timer.h等头文件的相关功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string.h主要定义了很多字符串操作函数

signal.h主要定义标准信号名,跟一些信号函数。

fcntl.h 主要针对文件系统,包含了Creat,open等系统调用, fcntl()用来操作文件描述词的一些特性,

其中有个重要的结构体。

 

struct flcok
{
short int l_type; /* 锁定的状态*/
short int l_whence;/*决定l_start位置*/
off_t l_start; /*锁定区域的开头位置*/
off_t l_len; /*锁定区域的大小*/
pid_t l_pid; /*锁定动作的进程*/
};
l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定
F_WRLCK 建立一个供写入用的锁定
F_UNLCK 删除之前建立的锁定
l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置。
SEEK_CUR 以目前文件读写位置为锁定的起始位置
SEEK_END 以文件结尾为锁定的起始位置。
terrnios.h
操作系统控制台跟终端接口是很复杂的。所以要有个标准,让不同硬件能跟操作系统和用户交互。
这个文件就干这些事情。它定义了控制终端类型的I/O 设备要用到的常量,宏和函数原型,
最重要的是terrnios结构,包含的内容有:标识各种操作模式的标志位,设置输入输出频率的变量和
放置特殊字符的数组。这个文件定义的东西多数是POSIX需要的。但后面它也定义了一些MINIX自己扩展的东西,
比如定义57600或以上的波特率。 
timer.h提供一些watchdog时间管理功能。
sigcontext.h
用于内核的内存管理器。定义一些用来在信号处理前后保存和恢复系统操作的结构。 
 
stat.h
定义了stat()和fstat()函数返回的结构,用来操作文件的。主要用于内存管理和文件系统上。
定义了chmod, fstat, mkdir, mkfifo, stat, umask这些函数的原型。 

 

好的,以下是一个简单的守护进程示例程序,可供参考。 ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <signal.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #define PID_FILE "/var/run/mydaemon.pid" #define TIMER_FILE "/tmp/mydaemon.timer" static int pid_fd = -1; static void signal_handler(int sig) { switch (sig) { case SIGHUP: break; case SIGTERM: if (pid_fd >= 0) { close(pid_fd); unlink(PID_FILE); } exit(EXIT_SUCCESS); break; default: break; } } static void daemonize() { pid_t pid, sid; pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } else if (pid > 0) { exit(EXIT_SUCCESS); } umask(0); sid = setsid(); if (sid < 0) { exit(EXIT_FAILURE); } if (chdir("/") < 0) { exit(EXIT_FAILURE); } close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } static int write_timer() { int fd, ret; char buf[64]; time_t now = time(NULL); fd = open(TIMER_FILE, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (fd < 0) { fprintf(stderr, "Failed to open timer file: %s\n", strerror(errno)); return -1; } sprintf(buf, "%ld\n", now); ret = write(fd, buf, strlen(buf)); if (ret < 0) { fprintf(stderr, "Failed to write timer file: %s\n", strerror(errno)); close(fd); unlink(TIMER_FILE); return -1; } close(fd); return 0; } int main(int argc, char *argv[]) { int ret; struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = signal_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; ret = sigaction(SIGHUP, &sa, NULL); if (ret < 0) { fprintf(stderr, "Failed to set signal handler for SIGHUP: %s\n", strerror(errno)); exit(EXIT_FAILURE); } ret = sigaction(SIGTERM, &sa, NULL); if (ret < 0) { fprintf(stderr, "Failed to set signal handler for SIGTERM: %s\n", strerror(errno)); exit(EXIT_FAILURE); } daemonize(); pid_fd = open(PID_FILE, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (pid_fd < 0) { fprintf(stderr, "Failed to open PID file: %s\n", strerror(errno)); exit(EXIT_FAILURE); } char pid_str[16]; sprintf(pid_str, "%d\n", getpid()); ret = write(pid_fd, pid_str, strlen(pid_str)); if (ret < 0) { fprintf(stderr, "Failed to write PID file: %s\n", strerror(errno)); close(pid_fd); unlink(PID_FILE); exit(EXIT_FAILURE); } while (1) { ret = write_timer(); if (ret < 0) { break; } sleep(1); } exit(EXIT_SUCCESS); } ``` 代码中包括以下功能: 1. 将程序变为守护进程,通过 `daemonize()` 函数实现。 2. 在 `/var/run/mydaemon.pid` 文件中写入守护进程的 PID,如果该文件已存在,则提醒用户程序已经运行。 3. 每秒向 `/tmp/mydaemon.timer` 文件中写入当前已经运行的秒数。 4. 可以通过捕获 `SIGHUP` 和 `SIGTERM` 信号来终止程序,SIGTERM 信号会在程序被kill时自动发送。 请注意,如果您要运行此代码,请先创建 `/var/run` 和 `/tmp` 目录,以及相应的文件,并使用 root 用户运行程序。如果您不想使用 root 用户运行程序,可以将文件路径改为普通用户可写的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值