- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
希望我能在这里找到一些帮助,因为我开始放弃了。请注意,因为这是一项家庭作业,因此为什么它可能很愚蠢。
语境:
必须编写一些将被 shell 执行的东西:
登录 [--tick n] cmd [args] [, cmd [args]]...
基本上,它是一个同时运行多个程序的程序。
约束:
每个输出行都必须以它的命令编号开头,格式为 printf "%d: %s"
IE:
0:第一个命令的第一行。
0:第一个命令的第二行。
1:第二条命令的第一行。
0:第一条命令的第三行。
1:第二条命令的第二行。
如果已指定刻度,则在 n 秒内未发送任何输出时,系统将打印一个句点。
必须使用 Select()
如果最后一个输出是一个句点,系统不会打印另一个句点。
现在这是我的问题!我能够使用单个命令使其工作。当我尝试使其成为多个命令时,我似乎失败了。我相信这可能是我的方法。也许你们中的一些人能够帮助我。
这是我尝试使用 Multiple Cmd 的方法。我可能完全错了,因此我需要帮助:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/time.h>
#include "readline.h"
// Reference: http://www.gnu.org/s/libc/manual/html_node/Waiting-for-I_002fO.html
int input_timeout (int filedes, unsigned int seconds)
{
fd_set set;
struct timeval timeout;
/* Initialize the file descriptor set. */
FD_ZERO (&set);
FD_SET (filedes, &set);
/* Initialize the timeout data structure. */
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
/* select returns 0 if timeout, 1 if input available, -1 if error. */
return (select (FD_SETSIZE,&set, NULL, NULL, &timeout));
}
/* Fetches the number of commands in parameters. Number of Commas + 1 */
int getNbCmd(char ** argv)
{
int nbCmd = 1;
int i;
while(argv[i] != '\0')
{
if(strcmp(argv[i], ",") == 0)
nbCmd++;
i++;
}
return nbCmd;
}
/* Fills the Command Array */
void getCommandes(char *** tbCmd, int argc, char ** argv)
{
int indexArgv = 1;
int indexCmd = 0;
int indexTbCmd = 0;
char ** cmd = (char **)malloc(argc*sizeof(char *));
if(strcmp(argv[indexArgv], "--tick") == 0)
indexArgv = 3;
while (indexArgv < argc)
{
if(strcmp(argv[indexArgv], ",") == 0)
{
cmd[indexCmd] = (char *) 0;
tbCmd[indexTbCmd] = cmd;
free(cmd);
cmd = (char **)malloc(argc*sizeof(char *));
indexTbCmd++;
indexCmd = 0;
}
else
{
char * arg;
arg = argv[indexArgv];
cmd[indexCmd] = arg;
indexCmd++;
}
indexArgv++;
}
cmd[indexCmd] = (char *) 0;
tbCmd[indexTbCmd] = cmd;
free(cmd);
}
int main (int argc, char ** argv)
{
int nbCmds = getNbCmd(argv);
int tick = -1;
char *** tbCmd = (char ***) malloc (nbCmds*sizeof(char **));
if(strcmp(argv[1], "--tick") == 0)
tick = atoi(argv[2]);
getCommandes(tbCmd, argc, argv);
int i;
pid_t pidM[nbCmds];
int p[nbCmds][2];
for (i = 0;i < nbCmds;i++)
{
if ( pipe( p[i] ) != 0 ){ perror( "pipe()" ); exit(1); }
// fork() to get child process
pidM[i] = fork();
if ( pidM[i] < 0 ){ perror( "fork()" ); exit(1); }
else if (pidM[i] == 0)
{
close(p[i][0]);
dup2(p[i][1], STDOUT_FILENO);
int ret;
ret = execvp(tbCmd[i][0], tbCmd[i]);
}
else
{
close(p[i][1]);
char * buffer;
int retval = 1;
int pntAfficher = 0; //Boolean for Period Printing
/* select returns 0 if timeout, 1 if input available, -1 if error. */
if(tick >= 0)
retval = input_timeout(p[i][0], tick);
if (retval == 0 && pntAfficher == 0)
{
printf(".\n");
pntAfficher = 1;
}
buffer = readline(p[i][0]);
while(buffer[0] != '\0')
{
printf("%d: %s",i, buffer);
free(buffer);
/* select returns 0 if timeout, 1 if input available, -1 if error. */
if(tick >= 0)
retval = input_timeout(p[i][0], tick);
if (retval == 0 && pntAfficher == 0)
{
printf(".\n");
pntAfficher = 1;
}
buffer = readline(p[i][0]);
pntAfficher = 0;
free(buffer);
}
}
}
free(tbCmd);
}
最佳答案
您需要在一个循环中 fork 所有子级,然后在第二个循环中,从所有子级中读取所有数据。
您想要并行收听所有 child 的输出(这就是 select
为您所做的),但所有 child 都需要运行才能使其工作。您当前的 for
循环产生一个 child ,然后转到 select
......这不是它的正确位置。
关于c - 迷失在多个 Fork()、Pipe() 和 Select(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851020/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我刚开始在“学习C++”类(class)中学习C++。我的教授丝毫没有帮助,也没有通过电子邮件发送问题。因此,我在这里,寻求我的第一份工作的帮助。 我真的很想学习,不想让任何人为我“完成”我的任务,但
我正在尝试使用 Eclipse 中的 WindowBuilder 插件创建 Java Windows 应用程序。我有一个 JTextField 在输入所需值时工作正常。但是,当我清除字段中的所有内容并
这个问题是针对运行 iOS 7 的 Xcode 5 的,非常奇怪。我正在尝试将所有 UInavigation 和 UIBarButtonItem 文本颜色设置为白色。 所以在我的应用启动委托(dele
我是一名优秀的程序员,十分优秀!