2

鉴于以下代码,我试图弄清楚这一点:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

char mynum='0';
int main(void)
{
   int i;
   pid_t fork_return;
   static char buffer[10];
   fork_return = fork();
   if (fork_return == 0)
   {
      strcpy(buffer, "CHILD"); /*in the child process*/
      for (i=0; i<5; ++i) /*both processes do this*/
      {
         mynum=i + '0';
         sleep(1); /*5 times each*/
         write(1, buffer, sizeof(buffer));
         write(1, &mynum, 1);
         write(1, "\n", 1);
      }
      return 0;
   }
   else
   {
      strcpy(buffer, "PARENT"); /*in the parent process*/
      for (i=0; i<5; ++i) /*both processes do this*/
      {
         sleep(1); /*5 times each*/
         write(1, buffer, sizeof(buffer));
         write(1, &mynum, 1);
         write(1, "\n", 1);
      }
      return 0;
   }
} 

请注意,这mynum是一个全局变量。

  • 孩子正在增加 ASCII 值mynum
  • 父母不是
  • Child和Parent可以轮流跑步

为什么子打印CHILD0, CHILD1, CHILD2, etc 而父打印PARENT0, PARENT0, PARENT0, 等等?记住mynum是一个全局变量。

另外,如果我分叉一个进程,为什么当我打印它们时pid,它们ppid总是相同的?

4

2 回答 2

1

父进程和子进程具有独立的虚拟地址空间。因此,子进程中全局变量的更新不会影响父进程中的全局变量。这是一种称为内存保护的功能,其中为一个进程分配的内存通常不能被其他进程访问。

pid检索getpid()的 是进程的进程 ID,每个进程都有一个唯一的。用ppid检索到getppid()的 是父进程 ID。只要父进程还活着,父进程 id 将是pid子进程所在的父进程的fork()d。当子进程的父进程死亡时,子进程会被init进程 ID 为 1 的进程继承。

于 2013-09-19T22:28:10.890 回答
1

因为它是否是全局变量并不重要,所以您可以在单独的进程中使用它们。

于 2013-09-19T22:29:08.783 回答