【发布时间】:2018-03-14 22:49:12
【问题描述】:
下一个代码应该写入“file.txt”PID 号,父进程为 1,子进程为 0。
我不确定代码是否正常工作,但我遇到了一个奇怪的 Printf() 问题,这会造成麻烦。 我不明白为什么,但是 printf 打印了两次相同的语句。
代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void print_pids(int fd,int n){
int i,p;
char msg[99];
for(i=n;i>0;i--){
p=fork();
if(p>0){
sprintf(msg,"My generation is 1.My pid is %d\n",getpid());
write(fd,msg,33);
wait();
}
if(p==0){
sprintf(msg,"My generation is 0.My pid is %d\n",getpid());
write(fd,msg,33);
}
if(p<0){
printf("cannot fork");
exit(0);
}
}
}
void main(){
int fd;
char buf[99];
fd=open("file.txt",O_WRONLY,700);
print_pids(fd,1);
close(fd);
fd=open("file.txt",O_RDONLY,700);
read(fd,buf,35);
printf(" %s\n",buf);
close(fd);
return;
}
而不是打印
My generation is 1.My pid is 8022
打印出来
My generation is 1.My pid is 8
My generation is 1.My pid is 8
这是为什么?
谢谢!
【问题讨论】:
-
子进程没有在
print_pids()中退出,所以它返回到main()并打开文件,读取它,打印它,然后退出。父母也这样做,但只是在孩子死后。如果您打印了执行打印操作的进程的 PID,您会得到更好的信息。使用带有固定大小缓冲区的write()也令人担忧。并且没有错误检查。 -
open() 应该使用 0700,而不是 700
-
void main()应该是int main(void)。如果你有推荐void main()的C教材,请把它扔到最近的墙上。