1.1 起因
ubuntu自帶 打字時禁用觸摸板 對fcitx輸入法并不起作用, 不帶鼠標(biāo)時很容易誤觸.
1.2 解決方法
在wiki.archlinux.org找到了相應(yīng)解決辦法:
# -i 2 打字時禁用觸摸板2s
# -d 以后臺daemon方式執(zhí)行
syndaemon -i 2 -d
但是總不能每次登陸后,都在shell中敲命令吧,所以需要登陸后自動執(zhí)行
有一下幾種方式可以實(shí)現(xiàn)自啟動:
- wiki.archlinux.org介紹的xinitrc
- ubuntu autostart xsessioin
- 在/etc/init.d/ 添加守護(hù)進(jìn)程
- 在~/.bashrc 添加命令自啟動
水平有限,對linux啟動部分不了解,采用的是最后一種方法. 自啟動的腳本參考用于檢測進(jìn)程的腳本總結(jié),如下
#!/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改為可執(zhí)行后, 在~/.bashrc 執(zhí)行即可.
#假設(shè)該腳本為 ~/.config/autostart/mystart.sh
. ~/.config/autostart/mystart.sh
不足之處:
.bashrc不是開機(jī)生效的,需要你打開shell才生效
1.3 守護(hù)進(jìn)程(還沒成功...找工作中,挖坑待填)
1.3.1 將下面的 syndaemon.cpp 編譯成可執(zhí)行文件復(fù)制到/etc/init.d/下面
1.3.2 執(zhí)行 update-rc.d命令, 可以參數(shù)設(shè)置可以參考這里和這里
//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 本身就是一個守護(hù)進(jìn)程所以不需要
* 調(diào)用daemonize函數(shù)了
* 寫著里主要是方便回顧知識
* */
//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