目标: 板子上有个进程需要通过读取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控制一个进程开启或关闭的更多相关文章

  1. nRF51822之app_button控制uart的开启和关闭

    为什么要使用app_button来控制uart的开启和关闭 还是先上datesheet中uart开启的时候需要HFCLK,需要消耗大量大电流.所以在我们需要的时候需要通过io来通知nrf51822开启 ...

  2. Android开发之控制Toast的开启与关闭

    开发这个程序之前先解释一下,为什么Toast信息提示框在显示一定时间后会自己主动消失?由于在Android系统中有一个Toast队列,系统会依次从这个队列中取出一个Toast,并显示它.在显示了指定时 ...

  3. C#开启一个进程

    Process myProc = null; myProc = Process.Start(@"E:\QQ轻聊\Tencent\QQLite\Bin\QQScLauncher.exe&quo ...

  4. service: no such service mysqld 与MySQL的开启,关闭和重启

    1.问题原因与解决办法 因为修改了MySQL临时文件的目录后,使用service mysqld restart重启MySQL出现如下错误: service: no such service mysql ...

  5. java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

    前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...

  6. C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别

    C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye    { //私有的构造函数,保证外部不能实例化        private  ...

  7. C# ASP.NET 控制windows服务的 开启和关闭 以及重启

    用ASP.NET控制Windows服务的开启与关闭效果如图 代码 首页页面需要添加引用 页面的pageload中 实例化windows服务 protected void Page_Load(objec ...

  8. python环境下实现OrangePi Zero寄存器访问及GPIO控制

    最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...

  9. HTTP的KeepAlive是开启还是关闭?

    HTTP的KeepAlive是开启还是关闭? http://itindex.net/detail/50719-http-keepalive 1.KeepAlive的概念与优势 HTTP的KeepAli ...

随机推荐

  1. 唯品会HDFS性能挑战和优化实践

    唯品会HDFS性能挑战和优化实践 原创: 大数据平台 唯技术 4月1日 https://mp.weixin.qq.com/s/LMa99ubgACI4eaDV3G-6gw  

  2. ES6展开运算符数组合并,函数传参

    定义: .展开运算符允许一个表达式在某处展开. 使用场景 1.展开函数在多个参数的地方使用 .意指用于函数传参 2.多个元素的地方使用,意指用于数组字面量 3.多个边框的地方使用,意指用于解构赋值 函 ...

  3. keras Dense 层

    文档地址:https://keras.io/layers/core/#dense keras.layers.Dense(units, activation=None, use_bias=True, k ...

  4. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  5. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

  6. mysql stream read.

    Statement stmt = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY) ...

  7. Go 自定义包引入报错

    配置文件 GO111MODULE=on 设置为on时,go命令行会使用modules,而一点也不会去GOPATH目录下查找.但自定义包在 $GOPATH/github.com/winyh/strrev ...

  8. MyBatis 的案例

    首先我们需要先下载jar包 其次我们书写具体的内容 Student  Class package entity; /* * 学生类 * */ public class Student { //学生编号 ...

  9. Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页

    背景: 文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能.页面长这个样子: 方案: 1.点击登录链接时,将该页面的URL传递到登录视图中 request.path获取的是当前页面的相对路 ...

  10. 在C/C++中常用的符号

    C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱,在网上找到了一篇英文文章简单总结了这两个符号的一些 ...