1.6程序和进程:
1.程序:
program是一个存储在磁盘上某个目录中的可执行文件。内核使用exec函数将程序读入内存,并执行程序。
#include <apue.h>
int main()
{
printf("hello world from process ID %ld\n",(long)getpid());
exit(0);
}
getpid 得到其进程的ID,返回一个pid_t数据类型。因为我们不知道它的大小,所以我们尽可能的强制类型转化为它可能用到的最大的数据类型。常整型可以提高可移植性。
实例1_7:简答的,模仿系统执行bash命令。
#include <apue.h>
#include <sys/wait.h>
int main()
{
char buf[MAXLINE];
pid_t pid;
int status;
printf("%% ");
while(fgets(buf,MAXLINE,stdin)!=NULL)
{
if(buf[strlen(buf)-1]!='\0')
buf[strlen(buf)-1]='\0';
if((pid=fork())<0){
err_sys("fork_error");
} else if(pid==0) {
execlp(buf,buf,(char *)0);
err_ret("could't execute: %s",buf);
exit(127);
}
if((pid=waitpid(pid,&status,0))<0)
{
err_sys("waitpid error");
}
printf("%% ");
}
exit(0);
}
关于本程序注意的点有:
1,fgets从标准输入一次读取一行。当键入文件结束符(通常是ctrl+D)作为行的第一个字符时,fgets返回一个null 指针,于是循环停止,进程也就终止(具体讲解在第18章)。
2,因为fget获取的字符串都是以'\n'即换行符结束的,所以我们将'\n'替换为C语言字符串标准结尾'\0',函数execlp要求传入的参数是以'\0'结尾的字符串。
3,该程序的缺陷是不能向命令添加参数只能执行简单的ls命令,而不能执行ls -a命令等。如果要这么做必须将输入的字符串分割,然后再以某种约定将参数分割开来,用空格或者制表符等。
1_7出错处理:
系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。
ex:open函数如果成功执行则返回一个非负的文件描述符。如出错怎返回-1.在open出错时,有大约15种不同的errno值(文件不存在,权限问题等)。
对于errno有俩条规则:
第一,如果没有出错,如果没有出错,其值不会被例程清除,仅当函数的返回值指明出错时,才校验其值。
第二,任何函数不会将errno设置为0。
C标准定义俩个函数,它们用于打印出错信息
#include <string.h>
char *strerror(int errnum);
strerror函数将errnum(errno)映射为一个出错消息字符串,并且返回此字符串的指针。
#include <stdio.h>
void perror(const char *msg);
perror函数基于errno的当前值,在标准错误上产生一条出错消息,然后返回。
它首先输出由msg指向的字符串,然后时一个冒号,一个空格,接着时对应于errno值得出错消息,然后是一个换行符。