FreeBSD源码学习——nohup命令源程序分析
(2005-10-31 16:04:0
nohup命令是最长用到的几个命令之一,看了一下他的源码,真没想到内部执行过程原来是如此的简单 ho...ho......
step 1:
if (argc < 1)
usage();
判断参数个数如果小于1,则显示帮助并退出。
step 2:
if (isatty(STDOUT_FILENO))
dofile();
判断标准输出是否为终端机,如果是则执行dofile自定义函数。对于使用nohup命令后跟被执行的命令后没有提供将信息输出指向到其他设备或文件时,isatty(STDOUT_FILENO)将返回1,并执行dofile()。
step 3:
static void dofile(void)
这个自定义函数完成的功能是使用getenv("HOME"获取路径并以 #define FILENAME "nohup.out" 中定义的FILENAME为文件名,创建程序执行输出信息存放的文件句柄,并使用dup2(fd, STDOUT_FILENO)将标准输出句柄复制到此文件句柄上,这样被执行程序本应该默认将信息输出到标准输出设备上的内容就转到默认的nohup.out文件里了。
step 4:
if (isatty(STDERR_FILENO) && dup2(STDOUT_FILENO, STDERR_FILENO) == -1)
err(EXIT_MISC, "%s", argv[0]);
判断标准错误输出是否为终端机,如果是,并且将标准错误输出句柄复制到标准输出句柄上,为了将错误信息直接输出到标准输出终端,这两步有一步操作失败则打印错误信息。
step 5:
(void)signal(SIGHUP, SIG_IGN);
屏蔽连接中断信号,以防止由于客户端连接中断造成nohup执行的程序无法完成。因为此语句的存在才让nohup命令具有实际意义。
step 6:
execvp(*argv, argv);
会从PATH环境变量所指的目录中查找符合nohup参数所指定的执行程序,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。执行失败则直接返回-1,失败原因存于errno中。
step 7:
exit_status = (errno == ENOENT) ? EXIT_NOTFOUND : EXIT_NOEXEC;
err(exit_status, "%s", argv[0]);
execvp执行后如果失败,只有两种可能,一种是被执行的程序不存在,另一种是不能执行,因此程序只判断了这两种状态,并当在发生的时候显示错误信息。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |