把程序守护进程化
这几天在看golang, 越来越觉得那是个超级好用的东西。
编程思路又换了一下,主要在golang的interface,是个很奇葩的想法。
怎么奇葩以后再说,等我弄的熟练一点再说。
额,这个不是主题。我是想说golang里面没有fork这个函数,
也就是说没有可以进行守护进程创建的方法。
真的没有吗?假的。只是说没有直接的方法,至少我知道两个:
1. 直接使用syscall调用原生的系统调用
2. 调用c的fork
话说我比较偏向第二种的,在go里面调用c的东西很简单喂
不不不,这里我只是想说我写了一小段代码可以把任何进程守护进程化。
原理还是挺简单的, C里面fork一段程序, 然后在子程序里面用exec函数。
然后就好了。很简单有没有!! 所以代码也是很简单的。
编译后把执行程序mv到/bin里面就大功告成了。这样就可以当做命令运行了。
写这个的目的是goagent哇, 每次翻那个什么墙都要运行程序,控制台还不能关。
还有那个断网后使用的自制的sock5借实验室网的东西。
现在开心了。
我还是保留了程序的stdout的输出, 因为不喜欢的话把那个控制台窗口关掉就好了, 程序反正还在跑的。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int i;
pid_t pid;
if(argc < 2)
{
printf("At least 2 arguments\n");
return 0;
}
pid = fork();
if(pid == 0)
{
// freopen("/dev/null","w",stdout);
i = execv(argv[1], &argv[1]);
if(i < 0)
printf("Error of: %s\n",argv[1]);
return 0;
}
printf("daeman pid: %d\n", pid);
return 0;
}
PS. 要期末考试了T.T
PSS. 在v2ex的有人提醒下,原来 & >/dev/null
就可以实现了。
我忘记&
是后台运行的意思了。。白痴
PSSS. 不好一个人闭门造车啊