通过gpio控制一个进程开启或关闭
目标: 板子上有个进程需要通过读取gpio的值, 当gpio值为1 时, 开启指定的进程,当gpio为0时, 杀掉这个指定的进程。
#include <stdio.h> int main()
{
FILE *pfile;
while (){
const char * FILEPATH = "/sys/class/gpio/gpio26/value";
pfile = fopen(FILEPATH, "r");
if (pfile == NULL)
{
printf("Open Error\n");
exit();
}
char buf[];
fgets(buf, , pfile);
//cvalue 保存读取到的gpio文件的值,0或者1
char cvalue = buf[]; char command[];
char bufresult[];
int count = ;
FILE * fp;
//这里的command中grep mjpg_streamer是过滤出mjpg_streamer进程,grep -v \"grep\" 是去掉grep自身的进程
sprintf(command, "ps | grep mjpg_streamer | grep -v \"grep\"");
if((fp = popen(command, "r")) == NULL)
{
printf("popen error\n");
exit();
}
// popen操作需要时间,sleep一下
sleep();
// 当没有mjpg_streamer进程时,bufresult读取结果会为NULL。此时将count置为0,表示没有mjpg_streamer进程在运行
if( (fgets(bufresult, , fp)) != NULL )
{
count = atoi(bufresult);
}
else
count = ; printf("count = %d\n", count);
if( count == && cvalue == '')
{
// 当gpio 为1时,count为0时,表示没有mjpg_streamer进程在运行,并且需要开启这个进程,调用/etc/init.d下服务启动程序
system("/etc/init.d/mjpg-streamer start");
//程序启动需要时间,sleep一下
sleep();
printf("Start OK!\n");
}
else if ( count != && cvalue == '')
{
//count不为0表示有mjpg_streamer进程,cvalue == '0' 表示指令要求杀掉进程, 调用killall命令
system("/etc/init.d/mjpg-streamer stop");
//system("killall mjpg_streamer");
printf("Kill OK!\n");
}
else printf("count = %d , cvalue = %c\n", count ,cvalue); pclose(fp); fclose(pfile);
sleep();
} return ;
}
注意点:
1. 直接用killall 方法可以杀进程,这里使用的服务启动和关闭的方法,更加安全和完整。
2. system函数后应该判断一下返回值再输出。
3.popen打开的文件要用pclose关闭。
通过gpio控制一个进程开启或关闭的更多相关文章
- nRF51822之app_button控制uart的开启和关闭
为什么要使用app_button来控制uart的开启和关闭 还是先上datesheet中uart开启的时候需要HFCLK,需要消耗大量大电流.所以在我们需要的时候需要通过io来通知nrf51822开启 ...
- Android开发之控制Toast的开启与关闭
开发这个程序之前先解释一下,为什么Toast信息提示框在显示一定时间后会自己主动消失?由于在Android系统中有一个Toast队列,系统会依次从这个队列中取出一个Toast,并显示它.在显示了指定时 ...
- C#开启一个进程
Process myProc = null; myProc = Process.Start(@"E:\QQ轻聊\Tencent\QQLite\Bin\QQScLauncher.exe&quo ...
- service: no such service mysqld 与MySQL的开启,关闭和重启
1.问题原因与解决办法 因为修改了MySQL临时文件的目录后,使用service mysqld restart重启MySQL出现如下错误: service: no such service mysql ...
- java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流
前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...
- C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别
C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye { //私有的构造函数,保证外部不能实例化 private ...
- C# ASP.NET 控制windows服务的 开启和关闭 以及重启
用ASP.NET控制Windows服务的开启与关闭效果如图 代码 首页页面需要添加引用 页面的pageload中 实例化windows服务 protected void Page_Load(objec ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- HTTP的KeepAlive是开启还是关闭?
HTTP的KeepAlive是开启还是关闭? http://itindex.net/detail/50719-http-keepalive 1.KeepAlive的概念与优势 HTTP的KeepAli ...
随机推荐
- linux 之oracle静默安装
一.安装前准备工作1.修改主机名#vi /etc/hosts //并添加内网IP地址对应的hostname,如下127.0.0.1 localhost::1 ...
- Redis操作类型
- 使用Docker快速搭建Tensorflow开发环境
当我刚开始学习使用scikit-learn时,总是会出现各种各样的包依赖问题,兜兜转转了一遍才全部安装好,现在的机器学习算法开发者大都使用tensorflow.pytorch来实现自己的想法,但依然会 ...
- mybatis的xml中也可以通过传入标记参数然后用 choose写选择语句【我】
mybatis的xml中也可以通过传入标记参数然后用 choose写选择语句
- React——相关工具概述
Create a New React App Use an integrated toolchain for the best user and developer experience. This ...
- elasticsearch _search结果解析
kibana中输入:GET /_search 会返回一下结果: { "took": 9, # took:整个搜索请求花费多少毫秒 "timed_out": fa ...
- spring boot入门学习---热部署
1.maven文件 2.application.properties文件配置
- java nio Files.newDirectoryStream用法
try(DirectoryStream<Path> dirStream = Files.newDirectoryStream(Paths.get(directory,"*.ts& ...
- kubenetes创建一个pod应用
Pod是可以创建和管理Kubernetes计算的最小可部署单元.一个Pod代表着集群中运行的一个进程.每个pod都有一个唯一的ip. 一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker) ...
- 关于类似QQ的展开和折叠效果的实现
介绍: 1.两级折叠与展开: 实现原理如下: 1>通过表视图的组的头视图和单元格实现; 2>通过改变cell的高度实现; 3>通过cell实现; 实现 UITableView 的ce ...