每个系统调用在返回时除了返回正常值外,还要返回错误码。Linux为了防止与正常的返回值混淆,并不直接返回错误码,而是将错误码放入一个名为errno的全局变量中。如果一个系统调用失败,可以读出errno的值来确定问题所在。errno不同数值所代表的错误消息定义在errno.h中。
一、fork系统调用
fork可能有以下三种不同的返回值。
1、父进程中,fork返回新创建子进程的进程ID。
2、子进程中,fork返回0。
3、如果出现错误,fork返回一个负值。
备注:
fork出错可能有两种原因:1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN;2)系统内存不足,这时errno的值被设置为ENOMEM。
fork系统调用出错的可能性很小,如果出错,一般都为第一种错误。如果出现第二种错误,说明系统已经没有可分配的内存。正处于崩溃的边缘。
二、exec系统调用
exec函数族的作用是根据指定的文件名找到可执行文件,就是在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。
三、wait系统调用
进程一旦调用wait,立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,释放PCB,并把它彻底销毁后返回;如果没有找到一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
1、参数为空
其中参数用来保存被收集进程退出时的状态,但如果对这个子进程如何死掉毫不在意,只想把这个僵尸进程消灭,可以设定这个参数为NULL。
pid = wait(NULL);
如果成功,wait返回被收集的子进程的进程ID,如果调用进程没有子进程,调用会失败,wait返回-1,同时设置errono被设置为ECHILD。
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(void)
{
pid_t pc, pr;
pc = fork();
if(pc < 0)// 如果出错
printf("error ocurred\n");
else if(pc == 0){// 如果是子进程
printf("This is child process with pid of %d\n", getpid());
sleep(10);
}else{ // 如果是父进程
pr = wait(NULL);
printf("I catched a child process with pid of %d\n", pr);
}
exit(0);
return 0;
}
./a.out
This is child process with pid of 18849
I catched a child process with pid of 18849
2、参数不为空
如果参数status的值不为NULL,wait会把子进程退出时的状态取出并存入其中,指出子进程是正常退出还是被非正常结束,以及正常结束时的返回值,或被哪个信号结束的等信息。
三、exit系统调用
这个系统调用是用来终止一个进程的。