请解释这些例子中 fork 的行为

请解释这些例子中 fork 的行为

参见示例 1,首先调用父进程,而示例 2 中首先调用子进程。我无法理解 fork() 的这种行为。请澄清。

例1:

main()
{ 
  int pid;
  if((pid=fork())>=0)
  {
     if(pid)
     {
       printf("parent\n");
     }
     else
     {
       printf("Child\n");
     }
  }
  else
    printf("Failed \n");

  if(pid)
    printf("Parent:After fork call\n");
  else
    printf("Child:After fork call\n");

}

O/p:-

 [home]$ ./a.out
 parent
 Parent:After fork call
 [home]$ Child
 Child:After fork call

示例 2

 main()
 {
   int pid;
   if((pid=fork())>=0)
   {
     if(pid)
     {
       printf("Parent\n");
       system("ls");
     }
     else
     {
       system("pwd");
     }
   }
   else
     printf("Failed \n");

   if(pid)
     system("ps");
   else
     printf("Child:After fork call\n");
 }

O/p:-
 Parent
 /home/neeraj/Vector/OS
 Child:After fork call
 a.out  sendsig    sendsig.c  test2.c  test3.c  test.c
 PID TTY          TIME CMD
 1943 pts/0    00:00:00 bash
 31719 pts/0    00:00:00 a.out
 31720 pts/0    00:00:00 a.out <defunct>
 31723 pts/0    00:00:00 ps

答案1

基本上花费的时间比返回ls要长得多(仅列出内存中必须与文件系统对话的变量),这就是区别所在。pwdpwdls

这是因为您正在创建新线程并且两个操作同时发生,某些操作比其他操作花费的时间更长。当您只是写出文本时,您可能已经让父线程始终可靠地先完成,但现在您正在执行实际工作,无论哪个线程先完成其工作,都将先完成。

相关内容