社区

Linux/Unix社区 帖子详情 为什么父进程一直阻塞呢, sunsweet_DK 2012-06-02 11:21:49

1 #include

2 #include

3 #include

4 int main()

5 {

6 int fd[2];

7 pid_t pid1,pid2;

8 char *arg_net[] = {"netstat","-lant",NULL};

9 char *env_net[] = {"PATH=/bin",NULL};

10 char *arg_grep[] = {"grep","22",NULL};

11 char *env_grep[] = {"PATH=/bin",NULL};

12 if(pipe(fd) != 0)

13 exit(1);

14 if((pid1 = fork()) == 0){

15 printf("pid1 = %d\n",getpid());

16 close(1);

17 dup2(fd[1],1);

18 close(fd[0]);

19 close(fd[1]);

20 execve("/bin/netstat",arg_net,env_net);

21 exit(0);

22 }else if(pid1 < 0 ){

23 printf("fork error\n");

24 exit(1);

25 }

26

27

28 if((pid2 = fork()) == 0){

29 printf("pid2 = %d\n",getpid());

30 close(0);

31 dup2(fd[0],0);

32 close(fd[1]);

33 close(fd[0]);

34 execve("/bin/grep",arg_grep,env_grep);

35 exit(0);

36 }else if(pid2 < 0){

37 printf("fork error\n");

38 exit(2);

39 }

40 printf("parent = %d\n",getpid());

41 waitpid(pid1,NULL,0);

42 waitpid(pid2,NULL,0);

43 return 0;

44 }

程序不能正常退出,父进程一直阻塞,求指点

...全文

133 7 打赏 收藏 为什么父进程一直阻塞呢, 1 #include 2 #include 3 #include 4 int main() 5 { 6 int fd[2]; 7 pid_t pid1,pid2; 8 char *arg_net[] = {"netstat","-lant",NULL}; 9 char *env_net[] = {"PATH=/bin",NULL}; 10 char *arg_grep[] = {"grep","22",NULL}; 11 char 复制链接

扫一扫 分享 转发到动态 举报 AI 作业

写回复 配置赞助广告取 消

确 定

用AI写文章 7 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 sunsweet_DK 2012-06-02 打赏举报 回复 [Quote=引用 2 楼 的回复:]

恩,exec问题

[/Quote]

execve改变了程序上下文,它后面的语句没执行。之所以父进程会阻塞,是因为在waitpid之前,子进程已经退出了,所以父进程才会一直阻塞,对吗 sunsweet_DK 2012-06-02 打赏举报 回复 [Quote=引用 3 楼 的回复:]

父进程没有close(pipe[1]);噢,这个结果就是netstat进程执行完毕退出并不会导致grep进程read EOF,所以grep进程始终不会退出噢.

[/Quote]

父进程如果close(fd[1])那么子进程还怎么写呢 qq120848369 2012-06-02 打赏举报 回复 父进程没有close(pipe[1]);噢,这个结果就是netstat进程执行完毕退出并不会导致grep进程read EOF,所以grep进程始终不会退出噢. 昵称很不好取 2012-06-02 打赏举报 回复 恩,exec问题 sunsweet_DK 2012-06-02 打赏举报 回复 我发现错误了,子进程没有退出,调用了execve的进程伤不起呀,exit()根本没执行 sunsweet_DK 2012-06-02 打赏举报 回复 [Quote=引用 6 楼 的回复:]

别幼稚了,麻烦40行之前插入close(fd[1]);

[/Quote]

谢谢你,好强大,果然好了,谢谢你 qq120848369 2012-06-02 打赏举报 回复 别幼稚了,麻烦40行之前插入close(fd[1]); 基于多进程的P2P聊天程序 server端与client都有两个进程:

父进程负责从socket中读取数据将其写至终端, 由于父进程使用的是read系统调用的阻塞版本, 因此如果socket中没有数据的话, 父进程会一直阻塞; 如果read返回0, 表示对端连接关闭, 则父进程会发送SIGUSR1信号给子进程, 通知其退出;

子进程负责从键盘读取数据将其写入socket, 如果键盘没有数据的话, 则fgets调用会一直阻塞; 子进程退出,父进程为什么要等待? 在模拟实现之前,我们首先看一下以下几点

一、父进程为什么要等待?

1、僵尸进程,造成内存泄漏

2、父进程得管理子进程,所以父进程派给子进程的任务完成的如何,我们都需要知道,如,子进程运行完成,运行结果对还是不对,或者是否正常退出

3、父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

二、等待的方法

wait方法

pid_t wait(int *status);

返回值:成功返回被等待... 55_进程之父进程调用wait回收子进程 子进程结束时,OS回向父进程发送一个SIGCHILD信号,关于信号会在下一个课程讲解, 父进程调用wait阻塞,wait是阻塞式的,父进程调用wait会被阻塞住,父进程调用wait就会一直在这里等SIGCHILD信号,收到这个信号就说明父进程要去回收僵尸进程了所以说父子进程是异步的,同步,两个任务在同样的节拍下工作,中断就是异步的,我永远不知道别人是什么状态的,父进程要尽快的回收子进程,所以这个发... 父进程和子进程的关系(Linux C 编程) 父进程和子进程是并行运行的,先运行哪个是不确定的,在小红帽系统中,先运行的是子进程,在ubuntu系统中,父进程是先运行的。

其实谁先运行不重要了,一般在编程中,把父进程当做守护进程使用,用一个waitpid(pid,&statloc,0) != pid 等待子进程的结束,父进程一直阻塞在这个函数中,阻塞或不阻塞跟第三个参数有关系。

举例:

#include

1、进程还在被其它进程使用,退出;

2、进程的子线程还在执行任务,但主线程已经死掉了(可能主线程已经被杀了,systemd停止服务时会发SIGTERM信号);

3、进程阻塞在某一IO请求上,这时控制权已交到内核手上,这时如果子进程被KILL掉, 那么就成为父进程ID为1的僵尸进程,这个进程不会退出,会一直阻塞直到IO请求被满足;

Linux/Unix社区

23,217

社区成员

74,540

社区内容

发帖 与我相关 我的任务 Linux/Unix社区 Linux/Unix社区 应用程序开发区 复制链接

扫一扫 分享 确定 社区描述 Linux/Unix社区 应用程序开发区 社区管理员

加入社区

获取链接或二维码

近7日

近30日

至今

加载中

查看更多榜单

社区公告

暂无公告 试试用AI创作助手写篇文章吧

+ 用AI写文章