C程序:多次执行bash脚本

时间:2016-10-13 07:03:36

标签: c linux bash

我有一个正在作为服务运行的C程序并侦听/ dev / input / even1设备并运行一个bash脚本,并将检索到的密钥ID作为参数。我想要做的是在按下按钮的同时多次启动脚本,尽管另一个实例仍在运行。因此,我将能够"计算"按钮点击。但问题是,当一个正在运行的另一个实例时,程序不会唤起脚本。显然它挂在系统(命令)上;步。所以问题是:有没有办法启动bash脚本并让它转到后台?这样的事情(注意& 符号)

   snprintf (command, sizeof(command), "./key.sh %d &", ev[1].code);
   printf(command);
   system(command);

以下是该计划:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <dirent.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/time.h>
#include <termios.h>
#include <signal.h>

void handler (int sig)
{
  printf ("\nexiting...(%d)\n", sig);
  exit (0);
}

void perror_exit (char *error)
{
  perror (error);
  handler (9);
}

int main (int argc, char *argv[])
{
  struct input_event ev[64];
  int fd, rd, value, size = sizeof (struct input_event);
  char name[256] = "Unknown";
  char *device = NULL;

  //Setup check
  if (argv[1] == NULL){
      printf("Please specify (on the command line) the path to the dev event interface device\n");
      exit (0);
    }

  if ((getuid ()) != 0)
    printf ("You are not root! This may not work...\n");

  if (argc > 1)
    device = argv[1];

  //Open Device
  if ((fd = open (device, O_RDONLY)) == -1)
    printf ("%s is not a vaild device.\n", device);

  //Print Device Name
  ioctl (fd, EVIOCGNAME (sizeof (name)), name);
  printf ("Reading From : %s (%s)\n", device, name);

  while (1){
      if ((rd = read (fd, ev, size * 64)) < size)
          perror_exit ("read()");      

      value = ev[0].value;

      if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event
       //printf ("Code[%d]\n", (ev[1].code));
       char command[32];
       snprintf (command, sizeof(command), "./key.sh %d &", ev[1].code);
       printf(command);
       system(command);
      }
  }

  return 0;
} 

这是脚本(它的一个适当部分):

    #!/bin/bash
    case $1 in
    172)
    log=log
    count=$(expr $(cat $log 2>/dev/null|wc -l) + 1)
    echo "$count $$" >>$log
    i=0
    until [ $i -eq 5 ];do
        sleep 1
        ((i++))
    done
    #my_number=$(cat $log|grep "$$"|cut -c1)
    if [ $count -lt `cat $log|wc -l` ];then
        exit 0
    else
        mpc play "$count"
        rm -f $log
    fi
    ;;
    esac

如果您认为整个概念都是错误的,那么任何想法都会受到高度赞赏。 为什么我使用事件处理程序:我运行无头服务器,因此xbindtools不起作用。 脚本我想做的事情:计算用户点击按钮的时间,在最后一次点击后的5秒内,播放带有按比例分配的计数的mpd歌曲。

0 个答案:

没有答案