将C语言中的fork()结果记录到文件中以查看结果

时间:2015-10-19 05:08:17

标签: c file logging output fork

我正在尝试获取程序每次运行的结果(父项和子项)。结果在屏幕上打印一次,在文件中只打印一次。我似乎无法创建两个唯一的文件(一个代表父,一个代表子)。我不确定getpid()是否是分离父和子识别的有效方法。我能做错什么?

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

    static char *app1="/path/to/app1";
    static char *app;
    static pid_t forky=-1;

    void otherfunction(){
      int aflag=1;
      //do something
      if (aflag==1){
        //run app 1
        app=app1;
        printf("Starting fork\n");
        forky=fork();
      }
    }

int main(){
      char dat[40000],test[10000];
      sprintf(dat,"Exec start\nFORKY = %d\nPID = %d\nPPID = %d\n",forky,getpid(),getppid());
      sprintf(test,"/TEST%d",getpid());
      int h=open(test,O_WRONLY|O_CREAT);
      write(1,dat,strlen(dat));
      write(h,dat,strlen(dat));
      close(h);
      otherfunction();
      return 0;
    }

2 个答案:

答案 0 :(得分:1)

您在调用fork之前创建了该文件。 fork是你做的最后一件事,然后两个进程都返回0。

答案 1 :(得分:0)

正如fork's man page中所指定的,通过调用fork创建的进程是父进程的副本,除了一些特定的差异,并且此子进程开始执行,就好像在调用{之后重新启动一样{1}}。所以,有点像你从fork得到两个回报,一个回归父母,一个回归孩子。所以,看起来你在这里问了两个问题:

如何区分父母与子女

同样,man page提到fork将在父进程中返回子进程的pid,并为子进程返回0,因此以下代码示例将获得两者的区分输出:

fork

为每个流程获取单独的文件

如上所述,在调用#include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { pid_t pid = fork(); if (pid == 0) printf("Hello from child!!!\n"); else if(pid > 0) printf("Hello from parent!!!\n"); else printf("Wow, fork failed!!!"); return 0; } 之后,两个进程都从恢复,因此必须在调用fork之后创建文件。在您的示例中,您在main中调用fork,因此otherfunction几乎是两个进程中的最后一次调用。

以下示例将为您提供每个流程具有不同内容的不同文件,以及为每个流程打印fork。这里使用stdout只是为了让您可以实际查看手册页所说的内容。

getpid