笔记1-3: 从标准输入读取命令并执行
来源:互联网 发布:大数据好学吗 编辑:程序博客网 时间:2024/04/30 15:15
从标准输入读取命令并执行:
#include <apue.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char ** argv)
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while (fgets(buf, MAXLINE, stdin) != NULL)
{
if (buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0; // replace newline with NULL
if ((pid = fork()) < 0) {
err_sys("fork error\n");
} else if (pid == 0) { // child,子进程从这里执行
execlp(buf, buf, (char*)0);
err_ret("could not execute : %s\n", buf);
exit(127);
}
// parent, 父进程从这里执行
if ((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error.\n");
printf("%% ");
}
return 0;
}
因为上面的gfets函数读入命令到buf时,缓冲区最后一个字符为’\n’,所以读入后,要把’\n’置换为NULL。
Unix通过fork函数创建一个新的进程,函数原型为:
pid_t fork (void);
pid_t为一个整数类型。
fork()的调用,会创建一个新的Unix进程,新进程是原进程的一个复制品,我们称呼原来的进程为父进程,新创建的进程为子进程。fork()调用一次,会得到两次返回。对于父进程,fork()会返回新的子进程的进程ID(非负数);对于子进程,fork()会返回0(分别在父子进程返回)。
fork()函数调用,会将父进程的地址空间完整地复制给子进程,调用后,父子进程各自拥有自己独立的进程空间。后续程序可根据pid_t的返回值,来确定父子进程的程序不同走向。
fork()返回负数,表示创建进程失败。
exec系列函数用于执行一个新的可执行文件。通常是在fork()后的子进程中调用,其作用是,把新的可执行文件加载到内存,来覆盖本进程的原有的进程空间,并跳到新可执行文件的起始位置重新执行。execlp()函数是exec()系列函数组中的一个。
父进程希望等待子进程终止,可以调用waitpid()函数实现。原型为:
pid_t waitpid(pid_t pid,int * status,int options);
pid指出子进程的ID,waitpid可以返回子进程的终止状态(status)。
- 笔记1-3: 从标准输入读取命令并执行
- 1.5 从标准输入读取命令并执行
- 从标准输入读命令并执行
- 1-5 从标准输入读入命令并执行
- APUE 1-7 从标准输入读命令并执行
- APUE 1-10 从标准输入读命令并执行
- 从标准输入中读命令并执行
- UNIX环境高级编程 chat1 从标准输入中读取命令执行
- 从标准输入读取
- 从标准输入行读取输入行并在标准输出中打印这些输入行
- C语言中从标准输入读取几行输入,并打印到标准输出上两种方法
- C 从标准输入读取源代码并在每一行前加上行标
- 从标准输入流中读取数据,并存储到文件中
- 【c语言】从标准输入读取c源代码,并验证所有花括号都成对出现
- 从标准输入流中读取数据
- C 从标准输入读取字符串.
- C++从标准输入读取一行字符串
- 【C++】从标准输入中读取字符串
- [举重若轻]android开发环境
- Apache配置多域名
- Mysql 5.5分区特性增强深度解析
- jQuery的Autocomplete
- 在Java中利用set特性删除重复的数组元素
- 笔记1-3: 从标准输入读取命令并执行
- mysql 重启一直出现省略号"....................." 无法重启
- [举重若轻]gnome3远程桌面nx安装
- oracle的shared server模式和dedicated server模式
- usb开发笔记之三:如何编写应用程序与 USB HID 设备通讯(读写USB HID 设备)
- Struts2再爆远程代码执行漏洞
- adt-bundle-windows-x86-20130514安装问题
- iPhone实战:定位与地图
- svn有效代码统计