vfork执行时出现Segmentation fault

1.首先明白vfork是干什么用的?

Linux命令行下输入man vfork回车
在这里插入图片描述
看红色框里的说明,翻译过来是vfork - 创建子进程并且阻塞父进程,block n.块 v.阻塞。
vfork执行时出现Segmentation fault_第1张图片
在手册的最底部出现下面红框的BUGS,说明vfork是由BUG的。翻译为信号处理的细节是有模糊的,在系统之间有差异(不同)。BSD手册页指出:“为了避免死锁情况,vfork()从不发送SIGTTOU(后台进程企图从控制终端写信号)或SIGTTIN(后台进程企图从控制终端读信号)信号;相反,允许输出或ioctl,并且输入会导致文件结束指令。”
vfork执行时出现Segmentation fault_第2张图片

2.出现Segmentation fault错误的代码如下:

#include 
#include 
#include 
int main()
{
        pid_t pid=vfork();
        if(pid==-1)
        {
                printf("Create process is fault.\n");
        }
        if(pid==0)
        {
                printf("Child process %d is running.\n",getpid());
        }
        else
        {
                printf("Parent process %d is running.\n",getpid());
        }
        return 0;
}

程序执行结果如下:
在这里插入图片描述
从程序结果可以看出,vfork是先执行子进程,然后执行父进程的,只不过这段代码出现了Segmentation fault。

3.使用strace命令跟踪一下这个程序

在Linux终端输入strace -f -s 65500 -i -T ./vfork
vfork执行时出现Segmentation fault_第3张图片
从跟踪结果中看只调用一次exit_group(0),正确的情况下应该执行两次return 0;

如何修改程序?

#include 
#include 
#include 
#include 
int main()
{
        pid_t pid=vfork();
        if(pid==-1)
        {
                printf("Create process is fault.\n");
        }
        if(pid==0)
        {
                printf("Child process %d is running.\n",getpid());
        }
        else
        {
                printf("Parent process %d is running.\n",getpid());
        }
        exit(0);//将return 0;替换了,exit()函数在stdlib.h头文件中
}

执行结果为:
在这里插入图片描述
从结果看出Segmentation fault错误消失了。

你可能感兴趣的:(C语言,linux,c语言,c++)