2015-10-19 52 views
0

我试图获取程序(父项和子项)每次运行的结果。结果只在屏幕上打印一次,而在文件中只打印一次。我似乎无法得到两个独特的文件(一个代表父母,一个代表孩子)。我不确定getpid()是分离父和子标识的有效方法。我可能做错了什么?在C中fork()的结果记录到文件以查看结果

#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; 
    } 

回答

1

您在调用fork之前正在创建该文件。叉是最后一件事,然后这两个进程返回0.

0

按照fork's man page中的说明,通过调用fork创建的进程是父进程的副本,除了一些特定的差异,并且此子进程开始执行仿佛在拨打fork后恢复。所以,这有点像你从fork得到两个回报,一个给父母,一个给孩子。因此,它看起来就像你在这里问两个问题:

如何区分父母和孩子

再次,man page提到叉将返回孩子的父进程PID和0的子过程,从而下面的代码示例将让你尊贵的输出从两个:

#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,所以必须在调用fork后创建。在你的例子中,你主要调用otherfunction last,所以fork几乎是两个进程中的最后一次调用。

以下是一个示例,它将为您提供每个进程的不同内容的不同文件,以及每个进程的stdout打印。这里使用getpid只是让你可以检查手册页的内容。

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

int main(int argc, char **argv) 
{ 
    pid_t pid = fork(); 
    int h; 
    char *test; 
    char dat[100]; 

    if (pid == 0) 
     test = "child"; 
    else if(pid > 0) 
     test = "parent"; 
    else 
     test = "failed"; 

    h = open(test,O_WRONLY|O_CREAT); 
    sprintf(dat, "%s | fork returned = %d | my_pid = %d\n", test, pid, getpid()); 
    write(1,dat,strlen(dat)); 
    write(h,dat,strlen(dat)); 
    close(h); 
}