c-Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1

问题描述

Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1

关于父进程先于子进程终止后,子进程应该由init进程收养,所以子进程的ppid不应该是1吗?但我用C语言查看时显示的确是另一个进程id:1795

#include<unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>

int main(void)
{
pid_t pid;

if((pid = fork()) == 0)
{
    sleep(4);
    printf("child 1, pid = %dtppid = %dn",pid, getppid());
    exit(0);
}
if((pid = fork()) == 0)
{
    sleep(3);
    printf("child 2, pid = %dtppid = %dn",pid, getppid());
    exit(0);
}

printf("parent, pid = %dtppid = %dn", getpid(), getppid());
exit(0);
}

结果如下:
parent, pid = 5462 ppid = 5305
child 2, pid = 5464 ppid = 1759
child 1, pid = 5463 ppid = 1759

求解释

解决方案

你这个打印出来的结果绝对是有问题的 ,我用你的代码重新敲了一下,我打印出来的结果是;
parent,pid = 5813 ppid = 5352
child 2 pid = 0 ppid = 1
chiled 1 pid = 0 ppid = 1

这样看来你所打印的pid 和ppid 都有问题,代码我觉得没什么问题 ,但是,看不懂你的打印结果

解决方案二:

pid应该是0,ppid应该是1.这才符合进程管理机制

解决方案三:

我也遇到了这种情况,用ps命令看了一下发现打出来的父进程号是init,ps:我也是ubuntu

解决方案四:

我也遇到了这种情况,用ps命令看了一下发现打出来的父进程号是init,ps:我也是ubuntu

解决方案五:

我在Ubuntu下也是这样,貌似跟Ubuntu采用的upstart有关,用一个名为init --user的进程代替了init,

只有kill掉那个进程才会被init接管。。。不知道有什么差别?

求解惑。。

时间: 2024-09-12 21:53:29

c-Linux父进程先于子进程终止后子进程的ppid不是init进程的id 1的相关文章

软件-C# 如何实现当一个指定的进程(非本身)结束后, 同时也结束掉自己的进程(本身)!

问题描述 C# 如何实现当一个指定的进程(非本身)结束后, 同时也结束掉自己的进程(本身)! 举例. 现在我同时打开了 软件A, 软件B, 软件A 是已经做好的软件或是游戏~ 不是我自己编写的. 软件B 是我自己现在要做的软件~ 如何实现 在两个软件同时打开的情况下, 关闭掉软件A, 那么软件B也会自动关闭. 关闭掉软件B, 强制结束掉软件A的进程! 解决方案 所谓的B自动关闭,其实就是B执行结束.因此来说,在B中只要判断A是否存活.A若存活,则继续执行.A若不存活,则结束程序,即可. 建议由B

Android Init进程对信号的处理流程详细介绍

Android  Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据一个

Linux中误删除了某个文件后从进程相关的文件描述中恢复数据

在Linux中误删除了某个文件,但是 ps-ef|grep 文件名 发现某个进程还在使用该文件,那么可以通 过以下方式恢复文件. 例如: 创建一个简单文件/tmp/test.txt, 随便向里面写点内容 两个client模拟,client1 负责打开文件less /tmp/test.txt(模拟占用线程) client2 负责恢复文件 恢复步骤(均在client2上执行) 1. 查看/tmp/test.txt被占用的进程id [root@host tmp]# ps -ef|grep test.t

linux-Linux系统下进程接收到信号后。。

问题描述 Linux系统下进程接收到信号后.. linux系统下,比如说一个进程给自身发信号,那么当进程接到信号时,是先执行发送语句的下一句,还是先执行信号处理函数? 解决方案 这个问题问的不是很具体. 一个进程给自身发信号(很罕见的情形),那么势必存在一个信号的监听函数listen,也就需要一个信号的处理函数handle. 而一般来说进程发出信号以后很可能有其他的任务要做,不能一直等待接收信号,所以要么采用多线程机制,要么采用异步选择机制. 如果是这样的话,先执行哪个任务就不好说了. 不知道我

linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉?

问题描述 linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉? linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉? 解决方案 不会.进程是独立的,不是线程.

线程-java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来

问题描述 java调用sqlplus下载数据库文件到本地后,如果用java关闭此进程,大神戳进来 1.用java调用sqlplus,将指定的存储过程下载到本地作为文本文件2.在java读取此本地文件做处理,处理后写1个新的文本文件在本地我将上面2个步骤用2个进程thread1,thread2因为步骤2必须等步骤1结束才能执行,所以我调用thread1.start()thread1.join()以及thread2.start().但是运行结果是每次都只执行出了步骤1,步骤2执行不出来.考虑是否在步

linux c语言刷新cpu cache后,如果判断数据真正从cache拷贝到内存中了?

问题描述 linux c语言刷新cpu cache后,如果判断数据真正从cache拷贝到内存中了? linux c语言刷新cpu cache后,如果判断数据真正从cache拷贝到内存中了? 解决方案 用secureCRT看打印信息啊

自己写的一个java程序,怎么在linux下设置成用户登录后启动?

问题描述 自己写的一个java程序,怎么在linux下设置成用户登录后启动? 我自己目前的办法是自己写了一个脚本,内容是:#!/bin/bashcd /ablationjava -jar newablation130222_fat.jar &然后在桌面终端下vi ~/.bash_profile 按i在文档的最后加入sh /ablation/auto.sh按esc然后按:w 回车键 但是这个办法不是很好,我希望通过纯代码实现,或者写一个脚本让java调用这个脚本在实现,请问各位该怎么办啊

linux编程-一个小的Linux程序,一运行电脑就自动关机。(要求两个进程轮流打印1.2.3.4....)

问题描述 一个小的Linux程序,一运行电脑就自动关机.(要求两个进程轮流打印1.2.3.4....) #include #include #include #include #include void f_sigact(int num) { static int f = 2; // sleep(1); printf("I am father.This is %dn",f); f += 2; } void c_sigact(int num) { int static c = 1; //