1.1 起因
ubuntu自带 打字时禁用触摸板 对fcitx输入法并不起作用, 不带鼠标时很容易误触.
1.2 解决方法
在wiki.archlinux.org找到了相应解决办法:
# -i 2 打字时禁用触摸板2s
# -d 以后台daemon方式执行
syndaemon -i 2 -d
但是总不能每次登陆后,都在shell中敲命令吧,所以需要登陆后自动执行
有一下几种方式可以实现自启动:
- wiki.archlinux.org介绍的xinitrc
- ubuntu autostart xsessioin
- 在/etc/init.d/ 添加守护进程
- 在~/.bashrc 添加命令自启动
水平有限,对linux启动部分不了解,采用的是最后一种方法. 自启动的脚本参考用于检测进程的脚本总结,如下
#!/bin/bash
# file: 自启动脚本
_pgrep="/usr/bin/pgrep"
found="true"
$_pgrep syndaemon >/dev/null || { found="false" ; echo "not found"; }
if [[ "$found" == "false" ]]; then
/usr/bin/syndaemon -i 2 -d
接下来就简单了,将上脚本保存,并利用chmod改为可执行后, 在~/.bashrc 执行即可.
#假设该脚本为 ~/.config/autostart/mystart.sh
. ~/.config/autostart/mystart.sh
不足之处:
.bashrc不是开机生效的,需要你打开shell才生效
1.3 守护进程(还没成功...找工作中,挖坑待填)
1.3.1 将下面的 syndaemon.cpp 编译成可执行文件复制到/etc/init.d/下面
1.3.2 执行 update-rc.d命令, 可以参数设置可以参考这里和这里
//file syndaemon.cpp
#include <unistd.h> //execl
#include <fcntl.h> //open, dup2
#include <signal.h>
#include <stdlib.h> //exit
#include <stdio.h> //perror
int daemonize();
const char syndaemon[]="/usr/bin/syndaemon";
int main(int argc, char* argv[])
{
/*
* 由于syndaemon 本身就是一个守护进程所以不需要
* 调用daemonize函数了
* 写着里主要是方便回顾知识
* */
//daemonize();
execl(syndaemon, "-i 2","-d");
exit(1);
}
int daemonize()
{
int fd;
struct sigaction sa;
switch (fork()) {
case -1:
return (-1);
case 0:
break;
default:
//close parent process;
//let child process become orphan process;
_exit(EXIT_SUCCESS);
}
//成为 leader of session and of process group
setsid();
/*
* Ensure future opens won't allocate controlling TTYs.
*/
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGHUP, &sa, NULL) < 0)
exit(1);
if (setsid() == -1)
return (-1);
if ((fd = open("/dev/null", O_RDWR)) != -1) {
close(STDIN_FILENO); //close stdin 0
//将stdout 重定义到 fd
if(dup2(fd, STDOUT_FILENO) < 0) {
perror("dup2 stdout");
return (-1);
}
//将 stderr 重定义到 fd
//不会记录error log
if(dup2(fd, STDERR_FILENO) < 0) {
perror("dup2 stderr");
return (-1);
}
}
return (0);
}
#!/bin/bash
syndaemon -i 2 -d
网友评论