我有一个正在作为服务运行的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歌曲。