linux进程fork求教,谢谢

rasonboy 2010-08-12 05:10:22
求教,源程序如下(t1.c):
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
pid_t child = 0;
int i,n;
i = 0;
n = 0;

printf("%d befor %d\n",getpid(),i);
if((child = fork()) <= 0) goto App;
else printf("%d:%d,产生的child进程号为[%d]\n",getpid(),i,child);
App:
printf("mypid is %d,my i is %d,my father is %d,my child is %d\n",getpid(),i,getppid(),child);

return 0;
}
编译命令是:gcc -o 11 t1.c
执行结果为:
7895 befor 0
7895:0,产生的child进程号为[7896]
mypid is 7895,my i is 0,my father is 7409,my child is 7896
7895 befor 0
mypid is 7896,my i is 0,my father is 1,my child is 0

我想问一下,父进程7895产生的子进程7409 goto到App之后,其子进程输出完mypid is 那句话之后不是就退出了吗?
但是为什么7895 befor 0会输出两次呢?谢谢了
...全文
140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaonan87 2010-08-13
  • 打赏
  • 举报
回复
不好意思,之前发不了帖子,所以,就在这里先贴上一帖。
xiaonan87 2010-08-13
  • 打赏
  • 举报
回复
系统调用一般都是SYS_开头的,通常都是在C库中调用库函数从而间接的调用SYS_函数,并且执行库函数的进程从用户态向核心态转变。但是,在书上看到进程调度一章中,会有setpriority函数,并且书上称这个函数为系统调用,并且看到示例程序中,在程序中直接使用setpriority(),故迷惑了,不是说为了可移植,应用程序都是通过C库去实现的系统调用吗?为什么又可以直接调用setpriority()直接实现系统调用,还是说这个没有"sys_"标志的函数根本不是系统调用。

想请问,这个setpriority是属于哪一个层次的,到底是不是系统调用啊?
crazy_srong 2010-08-13
  • 打赏
  • 举报
回复
顶顶 看看
jldream110 2010-08-12
  • 打赏
  • 举报
回复
把fork出错情况 <0 和 子进程的 ==0 放在一起不好
jldream110 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rasonboy 的回复:]

自己结贴,其实执行直接执行./11是正确的
但是./11 >> 22.txt
cat 22.txt
就会出现问题所述的情况。关键点是">>"
[/Quote]

虽然结果对了 但 最好这么写 if((child=fork())<0)
error;
else if(child == 0)
{
child
}
else{
parent
}
tankdin 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rasonboy 的回复:]

自己结贴,其实执行直接执行./11是正确的
但是./11 >> 22.txt
cat 22.txt
就会出现问题所述的情况。关键点是">>"
[/Quote]
汗,只看了你的问题,想当然了,抱歉~
rasonboy 2010-08-12
  • 打赏
  • 举报
回复
自己结贴,其实执行直接执行./11是正确的
但是./11 >> 22.txt
cat 22.txt
就会出现问题所述的情况。关键点是">>"
rasonboy 2010-08-12
  • 打赏
  • 举报
回复
???
rasonboy 2010-08-12
  • 打赏
  • 举报
回复
楼上说的正确,我的问题是为什么这句话7895 befor 0输出了两次呢?我感觉应该是输出一次啊
tankdin 2010-08-12
  • 打赏
  • 举报
回复
对父进程而言,fork返回子进程PID,但对于子进程而言,fork返回0。
fork子进程以后,同时复制了pc,因此子进程也从fork返回处开始运行。
rasonboy 2010-08-12
  • 打赏
  • 举报
回复
还是不懂,请明示,谢谢啦
谭海燕 2010-08-12
  • 打赏
  • 举报
回复

if((child = fork()) <= 0)

//你能告诉我,(child = fork())这个表达式有几种状态么?



想象那个问题,你就知道为什么会有这个结果了。

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧