面试题答案
一键面试- C语言进程退出返回值与系统调用机制的交互:
- 在C语言中,进程通常通过
exit
函数或从main
函数返回退出。exit
函数实际上是通过系统调用_exit
来实现最终的进程终止。例如,exit(0)
会调用_exit(0)
。当_exit
系统调用执行时,内核会清理进程相关的资源,如打开的文件描述符等,并将进程的退出状态(也就是返回值)传递给父进程。父进程可以通过wait
或waitpid
系统调用来获取子进程的退出状态。
- 在C语言中,进程通常通过
- 程序出现段错误导致进程异常退出时系统对返回值的处理:
- 当程序出现段错误(Segmentation fault)时,进程会异常终止。此时,进程的终止状态不是通过正常的
exit
返回值来表示。系统会向进程发送SIGSEGV
信号,默认情况下,进程接收到该信号后会终止,并产生一个核心转储文件(如果系统配置允许)。进程的终止状态会包含信号编号等信息,父进程通过wait
或waitpid
获取到的退出状态可以通过宏(如WIFSIGNALED
和WTERMSIG
)来解析,以得知进程是因何种信号而终止。例如,对于段错误,WTERMSIG
获取到的信号编号为11(SIGSEGV
的编号)。
- 当程序出现段错误(Segmentation fault)时,进程会异常终止。此时,进程的终止状态不是通过正常的
- 通过代码捕获这种异常退出并给出自定义的返回值信息:
- 可以使用信号处理机制来捕获
SIGSEGV
信号。以下是一个示例代码:
- 可以使用信号处理机制来捕获
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void segv_handler(int signum) {
// 这里可以进行一些清理工作
printf("Caught segmentation fault. Exiting with custom status.\n");
exit(1); // 自定义返回值1
}
int main() {
signal(SIGSEGV, segv_handler);
// 模拟段错误,例如访问非法内存
int *ptr = NULL;
*ptr = 10;
return 0;
}
在上述代码中,通过signal
函数注册了一个SIGSEGV
信号的处理函数segv_handler
。当发生段错误时,会执行该处理函数,在处理函数中可以进行自定义的操作,包括以自定义的返回值退出进程。