gpt4 book ai didi

c - 带字符串的管道系统

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:27 25 4
gpt4 key购买 nike

我正在使用 C 中的字符串处理管道系统。例如,我将此行写入控制台 ./pipeline LOWERCASE REVWORD SQUASHWS < stringFile.txt .它应该是这样的 P0 -> P1 -> P2 -> ...-> Pn。 P0 从文件中加载字符串 stringFile.txt并将其发送到 P1.. 我可以使用管道(发送和读取),但我不知道如何使用 N 个进程。应该是这样的。你能给我任何建议或例子吗?谢谢

while(is_something_to_read) {
load_from_previous_process();
do_process(); // for example LOWERCASE
send_to_next_process();
}

最佳答案

帕特里克,

我编写了一个程序来模拟一个 shell,该 shell 将生成一定数量的子进程,然后每个进程将与另一个进程通信。由于进程的数量可能会有所不同,我决定对管道使用二维数组。在下面的代码中,NUM_PROCS 指的是将要运行的进程数量(包括父进程)。

我声明

int pipes[NUM_PROCS][2];

在此之后,我创建管道

for(i = 0; i < NUM_PROCS; i++) 
{
if((pipe(pipes[i])) < 0)
{
perror("Failed to open pipe");
}
}

这是我为了练习而写的shell程序。

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

#define MAXARGS 256
char ** getargs(char * cmd) {
char** argsarray;
int nargs = 0;
int nlen = strlen(cmd);
int i = 0;
argsarray = (char**) malloc(sizeof(char*) * MAXARGS);
argsarray[0] = strtok(cmd," ");
i = 0;
while (argsarray[i] != NULL){
i++;
argsarray[i] = strtok(NULL," ");
}
return argsarray;
}


int main(void){

pid_t childpid;
int fd[256][2];
char cmd[256];
char * sepCmd[256];
char * pch;

printf("Please enter a command sequence: \n");
gets(cmd);
printf("You have entered: %s ....%d\n", cmd,strlen(cmd));


printf("Attempting to split up command: \n");
pch = strtok (cmd, "|");
int count = 0;
while (pch != NULL && count < 256) {
printf("%s\n", pch);
sepCmd[count] = pch;
printf("The value in this array value is: %s\n", sepCmd[count]);
pch = strtok (NULL, "|");
count++;
}

char ** argue;
int k;

/* Block that deals with the first command given by the user */
k = 0;
pipe(fd[k]);
if(!fork()) {
dup2(fd[k][1], STDOUT_FILENO);
close(fd[k][0]);
argue = getargs(sepCmd[k]);
execvp(argue[0], argue);
perror(argue[0]);
exit(0);
}

/*Loop that will control all other comands except the last*/
for(k = 1; k <= count - 2; k++) {
close(fd[k-1][1]);
pipe(fd[k]);

if(!fork()) {
close(fd[k][0]);
dup2(fd[k-1][0], STDIN_FILENO);
dup2(fd[k][1], STDOUT_FILENO);
argue = getargs(sepCmd[k]);
execvp(argue[0], argue);
perror(argue[0]);
exit(0);
}
}
/*Block that will take care of the last command in the sequence*/
k = count - 1;
close(fd[k-1][1]);
if(!fork()) {
dup2(fd[k-1][0], STDIN_FILENO);
argue = getargs(sepCmd[k]);
execvp(argue[0], argue);
perror(argue[0]);
exit(0);
}
while(waitpid(-1, NULL, 0) != -1);
}

关于c - 带字符串的管道系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com