繁体   English   中英

UNIX进程行为

UNIX process behavior

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图理解以下代码:

int main(int argc, char **argv)
{
   int pid1,pid2;
   if((pid1=fork())<0)
   { 
       printf("Error bla bla");exit(1);
   }
   else printf("A");
   if((pid2=fork())<0)
   {   
      printf("Error bla bla");exit(2);
   }

  if(pid1==0)printf("B\n");
  if(pid2==0)printf("C\n");
  exit(0);
  return 0;
}

我得到的输出看起来像这样:

A  
AC  
AB  
AB  
C 

如果我将第一个打印更改为printf("A\\n"); 输出是

A  
C  
A  
B  
B  
C 

在这种情况下流程如何表现? 我知道第二个fork()在父进程和第一个子进程中都执行了,但是为什么输出看起来像这样?
另外,为什么它按该特定顺序打印最后3个字母?

2 个回复

首先,我认为此序列的结果定义不明确-取决于printf()的实现者和流程调度的变数。

通常,printf()将字符累积在缓冲区中,并在需要时打印它们-除非通常存在换行符'\\ n'触发立即打印。

如果该进程派生的字符仍保留在printf()缓冲区中,则父进程和子进程最终都将打印这些字符。 您分叉两次,导致4个过程。 我将原始进程称为G(祖父母)。 G在第一个分叉处创建P(arent)。 P的pid1 ==0。接下来,每个进程再次派生。 假设G创建A(unt),P创建C(hild)。 A和C的pid2 ==0。C的pid1 == 0。

它们全部都打印了原始A \\ n,或者在其printf缓冲区中有A。

那些pid1 == 0的人则打印f B \\ n。 如果缓冲区中还有A,则显示为AB \\ n pid2 == 0的那些,然后输出C \\ n

所以顺序是

G: A(\n)
P: A(\n)B\n
A: A(\n)C\n
C: A(\n)B\nC\n

G,P,A和C的运行顺序不确定。 但是任何给定进程的输出均按其printf()d的顺序显示。 它可能与其他进程的输出交错。

如果A上印有\\ n,则从除祖父母之外的所有序列中删除A(\\ n)。

造成混淆的可能原因是printf("A");的输出printf("A"); 在第二个fork时实际上没有写在终端上。 它在内存缓冲区中,因此将与其余过程一起复制。

1 了解Unix进程替换行为

在以上代码中,第一个生成文件描述符,然后生成文件名,而第二个生成hypen(-)字符,然后生成文件名。 为什么会这样呢? ...

2014-02-14 07:06:40 1 28   unix
3 Unix行为,两个不同的进程将描述符保存到同一个文件,一个进程删除该文件

我是一个Unix新手。 我有两个进程将句柄(文件描述符)保存到磁盘上的同一文件。 让进程为A,B和文件sample.txt说 进程A是生产者(将数据写入磁盘文件),进程B是消费者(从磁盘文件中读取)。 进程A已达到将文件句柄(描述符)关闭到磁盘文件sample.txt的程度, ...

4 Unix进程无限

我想知道在只有while(1);的程序中会发生什么while(1); 在Unix上使用g ++编译时,在main()函数中使用。 当我运行程序时,我看到0%的CPU使用率。 为什么是这样? 它不应该占用CPU吗? 编译器是否以某种方式对此进行了优化? 通过放置yield_proc ...

5 运行python的Unix进程

我有一个执行2个python脚本的cron。 如果进程正在运行,如何用“ ps”命令查看? 我的脚本名称是: json1.py json2.py ...

6 唯一标识UNIX进程

我目前正在编写一个bash脚本来杀死一个进程,然后再次启动它。 我正在使用 返回基于文件编码的进程列表。 基于文件编码查找进程并不理想,因为其他进程也可能具有此字符串。 我需要唯一地标识两个进程,但是它们具有非常通用的进程名称: 我的问题是,有什么方法可以向进程 ...

2014-08-29 15:33:15 1 182   bash/ unix
7 杀死Nohup进程UNIX

我正在使用nohup命令运行jar nohup java -jar Test.jar 我找不到正在运行的jar的PID。 我尝试: ps斧| grep Java 但它没有列出,然后我尝试了 ps -ef | grep nohup 我得到 ...

8 unix进程使用的文件

fuser命令让我知道哪些进程正在使用文件或目录。 我正在寻找相反的命令:让我知道进程正在使用哪些文件。 更新 忘记提到它是用于Solaris系统的。 ...

9 UNIX 上的进程大小

在Solaris, HP-UX和AIX上获取进程大小的正确方法是什么? 我们应该使用top还是ps -o vsz或其他什么? ...

2008-08-04 07:34:44 4 21640   unix/ size
10 Unix进程ID

如何编写一个脚本,该脚本在后台(间隔5秒)运行一个子进程的5个实例,并进行连续检查以查看是否有任何子进程已完成,它将启动同一进程的另一个实例,直到子进程已执行20个实例。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM