【问题标题】:Program that changes PID every n seconds每 n 秒更改一次 PID 的程序
【发布时间】:2016-03-20 10:51:24
【问题描述】:

我是 C 系统编程的新手。

在这里,我正在尝试编写一个每 (n=2) 秒更改一次 PID 的程序。但是在编译时,我每次都得到相同的 PID。 PID 永远不会改变。请问有人有意见吗?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){

printf("Programme qui change de PID toutes les deux secondes \n");
pid_t fils;

while(1){
    printf("I'm %d\n",(int)getpid());
    sleep(5);
    fils = fork();
    if(fils < 0){
        perror("Fork child \n");
        exit(1);
    }
    else if (fils ==0 )
        exit(0); 

}
return 0;
}

【问题讨论】:

  • 尝试将else if (fils ==0 ) 更改为else if (fils &gt; 0 )。如图所示,您的代码退出子进程并保持相同/第一个父进程运行。因为它当然是同一个进程,所以它的 pid 保持不变。
  • @kaylum,它有效!谢谢你:)
  • 次要选择:在 C 中表达非终止循环的规范方法是 for(;;),因为它避免了 while(1) 条件中的常量值布尔值(一些 lint 抱怨它)。而且打字更短!
  • @Jens : 谢谢你的建议 :)
  • @Jens: while(true) 完全是地道的 C。

标签: c


【解决方案1】:

PID 没有改变的原因是因为进程 pid 永远不会改变。并且在检查PID的值时,代码总是在父进程中。

现在,每个子进程都会收到自己的 PID。您可以让孩子在退出之前获取/显示其 PID。

【讨论】:

  • 谢谢你的回答:)
【解决方案2】:

这个

else if (fils ==0 ){
    //<- here
    //printf("my pid is %d\n", getpid());
           exit(0);  
}

是您分叉的新进程的范围。

您可以将此作用域视为它自己的main,并且该作用域将在具有自己的pid 的不同进程中运行。

(你可能想要_exit 而不是exit 以防止stdio 缓冲区的双重刷新。(子进程得到一个副本))

【讨论】:

  • 谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多