Fork execl dup2
实习需要用到上面的几个函数。先通过一个简单的例子来学习一下。
先写一个a.c代码输出hello
附:
在b.c代码中fork一个进程,将a.c的输出重定位到OUTPUT.txt中。
fork()函数。一个现有进程可以调用fork函数创建一个新进程。 由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。 两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。返回负值表示出错。
Dup2()函数。位于/usr/include/unistd.h中,函数声明形式
int dup2(int oldfd, int newfd); 第二个参数通常为0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),与标准输入、标准输出、标准错误输出相关联。比如上面的代码就是将标准输出和标准错误重定位到了OUTPUT.txt中
注:STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。
操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备(一般是键盘)的文件描述符。
STDIN_FILENO表示标准输入,同样,标准输出用STDOUT_FILENO,标准出错用STDERR_FILENO.
execl()函数。
在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。
当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。
例如:在shell命令行执行ps命令,实际上是shell进程调用fork复制一个新的子进程,在利用exec系统调用将新产生的子进程完全替换成ps进程。
exec系列函数原型:
在文件夹下编译使用g++ -o a a.c; g++ -o b b.c. 执行b就可以看到OUTPUT.txt中的输出内容