同时创建多个进程

macro2008 2009-07-07 09:31:20
请问怎么同时创建多个进程,比如10个,都创建完再运行进程,而不是创建一个运行一个。
...全文
320 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
一 铭 2009-07-17
  • 打赏
  • 举报
回复
用信号量试验了一下,感觉有个问题,信号量不排队,比如我向1号进程发信号,让它运行,然后再向2号进程发信息,然后是3,5,4,本来是想2最先运行,但也有可能是3最先运行 不知道有没有可以解决这个问题的方法
一 铭 2009-07-16
  • 打赏
  • 举报
回复
你把你的原始需求说一下把
为什么要这么做?
macro2008 2009-07-15
  • 打赏
  • 举报
回复
而且要1.2进程运行完才能运行3
macro2008 2009-07-15
  • 打赏
  • 举报
回复
谢谢,可是如果要用信号量实现呢,你可以写出用信号量实现的代码吗?
一 铭 2009-07-15
  • 打赏
  • 举报
回复
做了一个进程模型,调度顺序是1->3->2->4
但好像还有点问题,似乎信号有时候会丢失,大家再测试一下,有时间再看看:


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>


#define NUM 4


void sig_child(int signo);
void sig_alarm(int signo);

int done;
int srv_num = 0;
pid_t *thread = NULL;

int
main(void)
{
int i;
pid_t pid;

thread = calloc(NUM+1, sizeof(pid_t));

for (i = 1; i <= NUM; i++) {
if ((pid = fork()) == 0) {
srv_num = i;
break;
} else {
thread[i] = pid;
fprintf(stderr, "thread[%d]=%ld\n", i, thread[i]);
}
}

//here is parent
if (srv_num == 1) { //1 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,1, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 2) { //2 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,2, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 3) { //3 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok,3, I am %ld\n", getpid());
//exit(0);
}
if (srv_num == 4) { //4 child
//fprintf(stderr, "I am %ld\n", (long)getpid());
signal(SIGALRM, sig_alarm);
pause();
fprintf(stderr, "ok, 4, I am %ld\n", getpid());
//exit(0);
}


if (srv_num == 0) { //parent
fprintf(stderr, "p = %ld, thread[3]=%d\n", getpid(), thread[3]);
kill(thread[1], SIGALRM);
if (wait(NULL) == thread[1]) { //1:1
kill(thread[3], SIGALRM);
if (wait(NULL) == thread[3]) {//2:3
kill(thread[2], SIGALRM);
if (wait(NULL) == thread[2]) {//3:2
kill(thread[4], SIGALRM);
if (wait(NULL) == thread[4]) //last :4
fprintf(stderr, "all is ok \n");
}
}
}
}

exit(1);
}


void sig_alarm(int signo)
{
if (signo == SIGALRM)
return;
}

once_and_again 2009-07-15
  • 打赏
  • 举报
回复


一般 的 现在 的pc,一分钟 创建 5-6k个没问题吧
linqzly 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pipisi 的回复:]
...
kill(sig, pid);

在阻塞进程中捕获信号
sig(sig, action);//or sigaction()
pause();
[/Quote]
就是这样的,你可以在每个进程的一开始就这样写
int pause = 1;
void action(int sig)
{
pause = 0;
}

int main()
{
sig(sig, action);
while(pause)
{
;
}
//do other things
}

macro2008 2009-07-12
  • 打赏
  • 举报
回复
你说得很有道理,我现在10个进程已经创建好了,进程也可以阻塞了,但要怎么解除阻塞,接下去应该怎么做,可以说得详细一点吗,最好能有代码,谢谢:)
pipisi 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 macro2008 的回复:]
你说得很有道理,我现在10个进程已经创建好了,进程也可以阻塞了,但要怎么解除阻塞,接下去应该怎么做,可以说得详细一点吗,最好能有代码,谢谢:)
[/Quote]

kill(sig, pid);

在阻塞进程中捕获信号
sig(sig, action);//or sigaction()
pause();
Joan201401 2009-07-10
  • 打赏
  • 举报
回复
学习,正要用到
linqzly 2009-07-10
  • 打赏
  • 举报
回复
你可以先创建是指定个数的进程,然后让进程阻塞起来,当有信号过来的时候接触阻塞,同时保存各个进程的PID,当全部创建完后,然后按照的你要求,向各个进程发送信号,让进程运行起来。
Wolf0403 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 macro2008 的回复:]
帮我看下这个应该怎么做,谢谢
一开始先创建10个进程阻塞,然后再按要求的顺序执行
http://topic.csdn.net/u/20090701/10/df4c3781-ec58-499a-9172-19ea06c4c008.html
[/Quote]
简单说,运行哪个进程就创建哪个进程。
macro2008 2009-07-08
  • 打赏
  • 举报
回复
帮我看下这个应该怎么做,谢谢
一开始先创建10个进程阻塞,然后再按要求的顺序执行
http://topic.csdn.net/u/20090701/10/df4c3781-ec58-499a-9172-19ea06c4c008.html
macro2008 2009-07-07
  • 打赏
  • 举报
回复
fork10次,创建不止10个进程吧?
wanggang_0717 2009-07-07
  • 打赏
  • 举报
回复
i=0
while(i<10)
{
fork()
i++
}
  • 打赏
  • 举报
回复
[Quote=引用楼主 macro2008 的帖子:]
请问怎么同时创建多个进程,比如10个,都创建完再运行进程,而不是创建一个运行一个。
[/Quote]

创建了进程,进程就开始运行,除非你特意阻塞或者休眠。

pid_t pid;
i=0 ;
while(i <10)
{
pid=fork();
if(pid==0)
break; //每个子进程退出while
if(pid<0)
printf("fork error at %d\n",i);
i++ ; //父进程继续 循环fork
}

//子进程继续。。。。。。。。。

23,116

社区成员

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

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