我在Unix环境中完全是新手,我在Robbins的Unix系统编程书中遇到了一些问题。
这是简单的流程链,每个流程都会将一些信息打印到日志文件和stderr
#define BUFSIZE 1024
#define CREATE_FLAGS (O_WRONLY | O_CREAT | O_APPEND)
#define CREATE_PERMS (S_IRUSR | S_IWUSR| S_IRGRP | S_IROTH)
int main (int argc, char *argv[]) {
char buf[BUFSIZE];
pid_t childpid = 0;
int i, n;
if (argc != 3){ /* check for valid number of command-line arguments */
fprintf (stderr, "Usage: %s processes filename\n", argv[0]);
return 1;
}
/* open the log file before the fork */
n = atoi(argv[1]); /* create a process chain */
for (i = 1; i < n; i++)
if (childpid = fork())
break;
if (childpid == -1) {
fprintf(stderr, "Failed to fork");
return 1;
}
auto fd = open(argv[2], CREATE_FLAGS, CREATE_PERMS);
if (fd < 0) {
fprintf(stderr,"Failed to open file");
return 1;
}
sprintf(buf, "i:%d process:%ld parent:%ld child:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
fprintf(stderr, buf);
write(fd, buf, strlen(buf));
return 0;
}
它是在Netbeans 7.1上用g ++ 4.7编译的,运行命令是“$ {OUTPUT_PATH}”10 /home/maxim/testlog.log
所以问题是:
当我运行或调试项目时,它在控制台和文件中只打印出2或3行信息。但如果我通过childpid = fork()遍历“Step Over”,它会打印有关所有10个进程的信息。是一些编译器优化还是我的错?
即使打印所有行,输出也是
i:2 process:6571 parent:6566 child:6572
i:3 process:6572 parent:1 child:6573
i:4 process:6573 parent:6572 child:6574
...
i:9 process:6578 parent:1 child:6579
i:10 process:6579 parent:6578 child:0
某些进程的父pid值为1,这似乎是错误的
答案 0 :(得分:0)
如果每个进程都打开相同的输出文件,则会出现竞争条件,导致进程相互覆盖。这就是为什么它只会在你全速奔跑时发生。
当父进程结束时,根据Linux中的设置,任何仍然活着的子节点将被终止或获取新的父节点。在你的情况下,他们似乎得到了一个新的父母。新的父母是流程1.