【发布时间】:2011-10-31 01:39:13
【问题描述】:
程序要求用户输入要创建的进程数作为参数,所以基本上你会这样做:
$ ./program 4
它会生成这样的东西:
This is process 1 with ID 7389 and parent id 6550
This is process 2 with ID 7390 and parent id 7389
This is process 3 with ID 7391 and parent id 7390
This is process 4 with ID 7392 and parent id 7391
现在基本上需要在给定位置插入一个项目
$ ./program insert 3
它应该在第 3 行添加一个新进程,看起来像:
This is process 1 with ID 7389 and parent id 6550
This is process 2 with ID 7390 and parent id 7389
This is process 3 with ID 7399 and parent id 7389 //NEW
This is process 4 with ID 7391 and parent id 7390
This is process 5 with ID 7392 and parent id 7391
我不知道如何插入,如果可能的话,我将不胜感激任何帮助或建议
谢谢
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[ ]) {
pid_t childpid; /* indicates process should spawn another */
int error; /* return value from dup2 call */
int fd[2]; /* file descriptors returned by pipe */
int i; /* number of this process (starting with 1) */
int nprocs; /* total number of processes in ring */
/* check command line for a valid number of processes to generate */
if ( (argc != 2) || ((nprocs = atoi (argv[1])) <= 0) ) {
fprintf (stderr, "Usage: %s nprocs ID\n", argv[0]);
return 1;
}
if (pipe (fd) == -1) { /* connect std input to std output via a pipe */
perror("Failed to create starting pipe");
return 1;
}
if ((dup2(fd[0], STDIN_FILENO) == -1) ||
(dup2(fd[1], STDOUT_FILENO) == -1)) {
perror("Failed to connect pipe");
return 1;
}
if ((close(fd[0]) == -1) || (close(fd[1]) == -1)) {
perror("Failed to close extra descriptors");
return 1;
}
for (i = 1; i < nprocs; i++) { /* create the remaining processes */
if (pipe (fd) == -1) {
fprintf(stderr, "[%ld]:failed to create pipe %d: %s\n",
(long)getpid(), i, strerror(errno));
return 1;
}
if ((childpid = fork()) == -1) {
fprintf(stderr, "[%ld]:failed to create child %d: %s\n",
(long)getpid(), i, strerror(errno));
return 1;
}
if (childpid > 0) /* for parent process, reassign stdout */
error = dup2(fd[1], STDOUT_FILENO);
else /* for child process, reassign stdin */
error = dup2(fd[0], STDIN_FILENO);
if (error == -1) {
fprintf(stderr, "[%ld]:failed to dup pipes for iteration %d: %s\n",
(long)getpid(), i, strerror(errno));
return 1;
}
if ((close(fd[0]) == -1) || (close(fd[1]) == -1)) {
fprintf(stderr, "[%ld]:failed to close extra descriptors %d: %s\n",
(long)getpid(), i, strerror(errno));
return 1;
}
if (childpid)
break;
} /* say hello to the world */
fprintf(stderr, "This is process %d with ID %ld and parent id %ld\n",
i, (long)getpid(), (long)getppid());
close(fd[0]); /* Close unused read end */
close(fd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
return 0;
}
【问题讨论】:
-
在您的问题中,什么是插入?如果是作业,请标记您的问题有作业。
-
这听起来很奇怪。您想要查看现有的一组进程并重新连接它们的标准输入和标准输出,以便新进程成为管道的一部分?
-
是的,它的作业,我被卡住了
-
它基本上是一个环,问题是在位置 i 之后插入一个节点,只是不知道如何去做
-
顺便说一下,
perror(3)函数可以减少fprintf(stderr, ..., strerror(errno));调用的一些混乱。