

让 c 程序在 Linux 上保持后台运行以及日志输出
source link: http://i.lckiss.com/?p=7469
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

让 c 程序在 Linux 上保持后台运行以及日志输出
一年前搞了个树莓派,弄了个风扇和 oled 脚本,今年无意中发现几次风扇并没有按理想的状态运行,就重新看了下脚本,发现以前运行时启动就会阻塞在那而且有很多 printf,我想大概就是这么个原因。于是想起来改造:
- 脚本执行后创建守护进程后台运行
- 将打印改为日志输出
经过几天验证,发现挺顺利的。因为我并不从事 C 相关开发,文末也贴上了更为详细的文章,这里直接给出解决方案。
#include <fcntl.h> #include <unistd.h> #include <syslog.h> #define _PATH_DEVNULL "/dev/null" int daemon(int nochdir, int noclose); int main(void) { //启用日志 openlog("LOG_TAG", LOG_CONS | LOG_PID, 0); if (0 == daemon(1, 0)) { //守护进程开启成功 syslog(LOG_DEBUG, "daemon ok\n"); } else { //守护进程开启失败 syslog(LOG_ERR, "daemon failed\n"); } while (1) { //TODO 做一些常驻内存或者轮询的事 } //关闭日志 closelog(); return 0; } int daemon(nochdir, noclose) int nochdir, noclose; { int fd; switch (fork()) { case -1: return (-1); case 0: break; default: _exit(0); } if (setsid() == -1) return (-1); if (!nochdir) (void)chdir("/"); if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) { (void)dup2(fd, STDIN_FILENO); (void)dup2(fd, STDOUT_FILENO); (void)dup2(fd, STDERR_FILENO); if (fd > 2) (void)close(fd); } return (0); }
值得一提的是日志输出中 syslog 并不通用,我这边环境为 Ubuntu,这种日志是输出到/var/log/syslog
文件的,我选择它的原因是它最为简单。
daemon
函数参数解释:第一个参数是指是否需要将工作空间切换至/
,一般是不需要的,第二个参数是指是否需要将输出流转向到/dev/null
,所以:
daemon
函数的参数请传 1,0
,不然即使在后台运行,print 之类的还是会输出到当前控制台,仅在调试时传 1,1
。
另外任务什么的就把代码块放在 while(1)
中去做吧。
Recommend
-
13
上一节提到在C语言程序开发中,调用函数时需要根据判断其输出或者处理是否符合预期,才能做下一步的处理,否则很可能会引发灾难性的结果。例如下面程序员小明写的这段C语言代码:double get_val() { ... return val; } int fun1() {...
-
5
最后更新日期:2014-06-12 1. 数据的两种形态:离散态和序列化态 定义1.1:序列化态:数据存在于文件、网络中的状态,可以表示为 有顺序的 字节序列(或字符串) 定义1.2:离散态:与数据结构直接对应的形态,...
-
7
开机启动并隐藏 cmd 窗口程序在后台运行 - winsw 使用教程发表2020-05-04更新2020-08-01字数837预计阅读时长5分阅读次数117windowsWindows 下手动添加开机启动的方式一般是创...
-
3
后台运行jar包并输出日志 运行命令(注意路径)java -jar /web/share-book.jar > /web/log.txt &该命令的意思是:执行share-...
-
4
ping 命令是一种比较好用的网络诊断工具,常用来验证链路问题,例如 ping traceroute mtr 都使用的 “ICMP” 包来测试 Internet 两点之间的网络连接状况。生产环境中, 网络是否稳定 (网络时延) 是一个很重要的指标. 为了方便检查网络时延的大小, 我们可以通过 pin...
-
9
nohup 为什么要跟着 & 一起使用,不知道大家有没有思考过其中的小区别,另外很多人会推崇使用 screen,但是实际生产环境应用场景有限我就不展开了。这次实际遇到的问题主要是因为使用 crontab 调用了多个不同的 nohup 后台执行任务,然而代码逻辑中出现对相...
-
3
V2EX › Linux Linux server 后台有程序在运行的情况下,竟然无法关闭屏幕,救救孩子,阿里嘎多 ETON...
-
6
在使用SSH链接远程虚拟机的时候经常会出现网络连接不稳定而导致前台运行的代码终止运行的情况,怎样能让程序稳定地在后台运行,不受断线的影响?IBM Developer上的这篇文章很有帮助,转载方便以后查阅。 (转自
-
5
保持输出的欲望和习惯 2022.7.13 2022.7.13 Posts 一直都说要保持输出的习惯,而此前在学校期间较为自由和灵活的时间里,还真觉得保持输出并不是一...
-
5
V2EX › Python Python 程序的运行过程日志,是否有轮子可以实现 C/S 或者 B/S 放出来?
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK