Linux系统函数

exit函数

exit中的参数exit_code为0代表进程正常终止,若为其他值表示程序执行过程中有错误发生。出错时退出一般用exit(EXIT_FAILURE);

system()函数

这个函数是调用/bin/sh执行脚本的,有些命令如rosrun不能在/bin/sh下执行

WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。

所以一个典型的system函数的使用是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pid_t status;
std::string cmd = "rosnode kill /lidar";
status = system(cmd.data());
if (-1 == status) // 语句有错
{
return -1;
}
else
{
ROS_INFO("WIFEXITED return: %d",WIFEXITED(status));
if (WIFEXITED(status)) //返回一个非零值, 正常退出
ROS_INFO("child process exit done: %d", WEXITSTATUS(status) );
else
ROS_INFO("child process exit abnormally");
}

errno

errno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。系统每一次出错都会对应一个出错代码,例如12表示“Cannot allocate memory”。

stderr和fprintf函数

linux中的进程启动时,都会打开三个文件:标准输入、标准输出和标准出错处理。通常这三个文件都与终端联系。这三个文件分别对应文件描述符0、1、2。系队统自定义了三个文件指针stdin、stdout、stderr,分别指向标准输入、标准输出和标准出错输出。stderr是linux标准出错的文件指针,定义为extern struct _IO_FILE *stderr;,对应文件描述符2,通常结合fprintf使用:

1
fprintf(stderr,"error message");	//不必加换行

STDERR_FILENO和write函数

1
2
3
4
/* 文件描述符*/
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */

与上面用法类似,但write的首个参数是文件描述符:

1
2
char err[] = "error\n";
write(STDERR_FILENO,err,strlen(err)); //输出error(换行)

perror函数

需要包含头文件stdio.h,perror是错误输出函数,在标准输出设备上输出一个错误信息,是对errno的封装。perror(“fun”),其输出为:fun:后面跟着错误信息(加一个换行符)。

1
perror("status:");	//不报错时,输出 status:Success

strerror函数

stderror是通过参数errno,返回错误信息:printf("strerror: %s\n",strerror(errno));

atexit函数

功 能: 注册终止函数(即main执行结束后调用的函数)

用 法: int atexit(void (*func)(void)),也就是只能注册形参和返回值都为空的函数

exit函数和_exit函数都可以退出程序,但后者是立即进入内核,前者是做一些清理处理再进入内核.atexit函数就是用于执行清理时的一些操作.

exit调用终止处理函数的顺序和atexit登记的顺序相反.程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void  test1()
{
cout<<"test 1"<<endl;
}

void test2()
{
cout<<"test 2"<<endl;
}

void test3()
{
cout<<"test 3"<<endl;
}

int main()
{
atexit(test1);
atexit(test2);
atexit(test3);
return 0;
}

运行结果:
1
2
3
test 3
test 2
test 1

gethostname函数

功能是获得计算机主机名,形参分别是char*和字符长度,成功会返回0

1
2
3
4
char name[40];
memset(name,0,sizeof(name));
if(!gethostname(name,sizeof(name) ) )
printf("%s\n\n",name);