我正在尝试获取程序每次运行的结果(父项和子项)。结果在屏幕上打印一次,在文件中只打印一次。我似乎无法创建两个唯一的文件(一个代表父,一个代表子)。我不确定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;
}
答案 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