gpt4 book ai didi

c - 系统函数不输出任何东西

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:18 26 4
gpt4 key购买 nike

我一直在修补管道和父子通信,直到现在我才使用 system 函数调用将某些内容从子级传递给父级。问题是我相信 system 在我的示例中实际上没有任何输出。

parent 读取输入并将其发送给 child 以检查字符串是否为“已排序字母”。字符必须按字典顺序排列。我使用 system 组合 echogrep 并将结果发送回管道。我能够将其缩小到管道的父级读取端;它阻塞。我猜那是因为管道中没有任何东西可以读取并且写入端没有关闭。我知道这将是问题的原因,为了使它有意义,system 不必输出任何内容。

  /*
$ ./grep
AeIoU
Yes.
blah
No.
*/

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


#define STRING_SIZE 128

static void fatalError(char* message);
int checkIfAlpha(char *string, int length); //f-ja koja proverava da li se string sastroji samo od slova

int main(int argc, char const *argv[])
{

pid_t pid;
char input[STRING_SIZE]; //cuvamo input string ovde
char command[100 + STRING_SIZE];
int pipeToParent[2], pipeToChild[2];
int n;
char tmp[50];
int count;


if (pipe(pipeToParent) < 0)
fatalError("pipe error");

if (pipe(pipeToChild) < 0)
fatalError("pipe error");

if ((pid = fork()) < 0)
fatalError("fork error");
else if (pid == 0) {
//child
if (close(pipeToChild[1]) < 0)
fatalError("close error");

if (close(pipeToParent[0]) < 0)
fatalError("close error");

if (dup2(pipeToParent[1], STDOUT_FILENO) < 0)
fatalError("dup2 error");

while (1) {

if ((count = read(pipeToChild[0], tmp, 50)) < 0)
fatalError("read error");
fprintf(stderr, "2\n");
if (count == 0)
break;
sprintf(command, "echo '%s' | grep -i ^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$", tmp);

if (system(command) < 0)
fatalError("system error");

fprintf(stderr, "3\n");

}

exit(EXIT_SUCCESS);


}

//parent

if (close(pipeToParent[1]) < 0)
fatalError("close rror");


if (close(pipeToChild[0]) < 0)
fatalError("close error");

while(fgets(input, STRING_SIZE, stdin) != NULL) {

input[strlen(input)-1] = '\0';


if (checkIfAlpha(input, strlen(input)) == -1) {
fprintf(stderr, "Samo slova\n");
continue;
}
if (write(pipeToChild[1], input, strlen(input)) != strlen(input))
fatalError("write error");
printf("1\n");

if ((n = read(pipeToParent[0], input, STRING_SIZE)) < 0)
fatalError("fatal error");
printf("4\n");

if (n == 0)
printf("No\n");
else if (n > 0)
printf("Yes\n");

}

exit(EXIT_SUCCESS);

}


static void fatalError(char *message) {
perror(message);
exit(EXIT_FAILURE);
}

int checkIfAlpha(char *string , int length) {

int c = 1;

for (int i = 0; i < length; i++)
if (!isalpha(string[i])) {
c = -1;
break;
}

return c;
}

编辑:如果我认为它们有那么重要,我会发布输出,但无论如何。

这是输出(正确的输入):

./grep 
abcde
1
2
3

这是 GDB:

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffe058) at grep.c:23
23 {
(gdb) next
34 if (pipe(pipeToParent) < 0)
(gdb)
37 if (pipe(pipeToChild) < 0)
(gdb)
40 if ((pid = fork()) < 0)
(gdb)
42 else if (pid == 0) {
(gdb)
76 if (close(pipeToParent[1]) < 0)
(gdb)
80 if (close(pipeToChild[0]) < 0)
(gdb)
83 while(fgets(input, STRING_SIZE, stdin) != NULL) {
(gdb)

85 input[strlen(input)-1] = '\0';
(gdb)
88 if (checkIfAlpha(input, strlen(input)) == -1) {
(gdb)
92 if (write(pipeToChild[1], input, strlen(input)) != strlen(input))
(gdb)
94 printf("1\n");
(gdb)
1
96 if ((n = read(pipeToParent[0], input, STRING_SIZE)) < 0)
(gdb)

最佳答案

read不写入终止空字符。在if ((count = read(pipeToChild[0], tmp, 50)) < 0)之后, 程序通过 tmp , 不写入空字符到 sprintf .

这导致 echo命令从 tmp 传递额外的垃圾数据超出从管道中读取的内容,这反过来导致 grep找不到匹配的字符串。

一个解决方法是更改​​ readread(pipeToChild[0], tmp, sizeof tmp - 1)并插入 tmp[count] = 0; .

关于c - 系统函数不输出任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54227722/

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