c/c++语言开发共享通过C中的argv使用管道发送和接收字符数组

所以,我正在尝试创建一个管道,通过argv []连接的管道来回发送char数组。 现在,我一直坚持在接口中接收数组(从父节点发送到子节点的c_param的参数)。在db.c中接收字符3和5。 我知道3和5是我的管道所在的argv []的索引,但我不知道如何接受它并在db.c中打印出我的消息。

interface.c创建管道,分叉到父进程和子进程。 char数组param被转移到子进程到char数组c_param。 使用snprintf,我将我的管道变成了一个char,使用execl和我的char数组c_param发送。

interface.c:

int main (int argc, char *argv[]) { int to_Child[2]; int to_Parent[2]; int id, toChildPipe, toParentPipe, err; char param[100] = "This is the parameter!"; char sendPipe[100]; char recPipe[100]; /*CREATING PIPE*/ toChildPipe = pipe(to_Child); toParentPipe = pipe(to_Parent); if(toChildPipe == -1 || toParentPipe == -1) { printf ("Error on pipe creation: %d", errno); exit (1); } /*Creating Child Process*/ id = fork(); if(id == 0) { /** * * IN THE CHILD Process * */ close(to_Child[1]); //reading close(to_Parent[0]); //writing char c_param[100]; toChildPipe = read(to_Child[0], c_param, 100); if (toChildPipe == -1) { //If failed printf("Error on read from pipe from parent: %dn",errno); //exit with error exit(2); }//Error pipe from parent snprintf(sendPipe,sizeof(sendPipe), "%d",to_Parent[0]); snprintf(recPipe,sizeof(recPipe), "%d",to_Child[0]); err = execl("./db","db",sendPipe,recPipe,(char *)0); if(err == -1) { printf("Error on execl: %dn", errno); }//Error execl toChildPipe = read(to_Child[0], c_param, 100); if (toChildPipe == -1) { //If failed printf("Error on read from pipe from parent: %dn",errno); //exit with error exit(2); }//Error pipe from parent }//CHILD PROCESS else if (id > 0) { /** * *IN THE PARENT PROCESS * */ close(to_Child[0]); //writing close(to_Parent[1]); //reading toChildPipe = write(to_Child[1],param,100); if(toChildPipe == -1) { printf("Error on write to pipe: %d", errno); exit(3); } /*Piping was successful!*/ exit(0); }//PARENT PROCESS else { exit(4); } } 

db.c从interface.c execl启动,应该通过argv []接收参数,然后将其打印出来。 db.c

 #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { FILE *finput; int j = 0; int fd; int toChildPipe; char c_param[100]; if(argc > 1) { for(j ; j < argc ; j++) printf("argv = %sn", argv[j]); printf("argc = %dn",argc); } fd = atoi(argv[1]); printf("Statement: %sn", argv[fd]); strcpy(c_param, argv[3]); printf("filename: %sn", c_param); } 

这是我得到的当前输出,我知道5和3是我需要发送消息并接收我正在尝试在db.c中打印的消息的索引

输出(db.c):

 argv = db argv = 5 argv = 3 argc = 3 Statement: TERM=xterm 

我希望我能给你足够的信息,我感谢你愿意给我的任何帮助。 先感谢您!

    有很多小事错了。 你最大的问题是db.c关于interface.c传递给它的参数的假设/断言 – 传递的内容和预期的内容完全不匹配。 interface.c还有大量无关的代码。 特别是,子进程在执行db之前从管道中读取,因此管道上没有任何内容可供db读取。

    这是“固定”代码,一些调试代码仍然存在。

    interface.c

     #include  #include  #include  #include  #include  int main(void) { int to_Child[2]; int to_Parent[2]; int id; char param[100] = "This is the parameter!"; char sendPipe[100]; char recPipe[100]; if (pipe(to_Child) == -1 || pipe(to_Parent) == -1) { printf("Error on pipe creation: %d", errno); exit(1); } printf("Pipes: C(%d,%d), P(%d,%d)n", to_Child[0], to_Child[1], to_Parent[0], to_Parent[1]); id = fork(); if (id == 0) { close(to_Child[1]); // Child does not write to itself close(to_Parent[0]); // Child does not read what it writes snprintf(sendPipe, sizeof(sendPipe), "%d", to_Parent[1]); snprintf(recPipe, sizeof(recPipe), "%d", to_Child[0]); execl("./db", "db", sendPipe, recPipe, (char *)0); fprintf(stderr, "Error on execl: %dn", errno); exit(2); } else if (id > 0) { close(to_Child[0]); // Parent does not read childs input close(to_Parent[1]); // Parent does not int nbytes = write(to_Child[1], param, 100); if (nbytes == -1) { fprintf(stderr, "Error on write to pipe: %dn", errno); exit(3); } close(to_Child[1]); if ((nbytes = read(to_Parent[0], param, 100)) <= 0) { fprintf(stderr, "Error on read from pipe: %dn", errno); exit(5); } printf("Data from pipe: [%.*s]n", nbytes, param); exit(0); } else { perror("fork failed"); exit(4); } } 

    ### db.c

     #include  #include  #include  #include  #include  #include  int main(int argc, char *argv[]) { printf("argc = %dn", argc); for (int j = 0; j < argc; j++) printf("argv[%d] = %sn", j, argv[j]); if (argc != 3) { fprintf(stderr, "Usage: %s write-fd read-fdn", argv[0]); return 1; } int ofd = atoi(argv[1]); int ifd = atoi(argv[2]); printf("ifd = %d; ofd = %dn", ifd, ofd); char c_param[100]; int nbytes = read(ifd, c_param, sizeof(c_param)); if (nbytes <= 0) { fprintf(stderr, "Error: failed to read any data (%d)n", errno); return 1; } printf("Child: [%.*s]n", nbytes, c_param); assert(strlen(c_param) + sizeof(" - sent back to parent") <= sizeof(c_param)); strcat(c_param, " - sent back to parent"); if (write(ofd, c_param, nbytes) != nbytes) { fprintf(stderr, "Error: failed to write all the data (%d)n", errno); return 1; } return 0; } 

    样品运行

     Pipes: C(3,4), P(5,6) argc = 3 argv[0] = db argv[1] = 6 argv[2] = 3 ifd = 3; ofd = 6 Child: [This is the parameter!] Data from pipe: [This is the parameter! - sent back to parent] 

    请注意,代码会将错误报告给标准错误(这就是它的用途)。 它还界定了打印数据,可以更容易地发现意外问题。 它不假设数据为空填充; 它将打印的长度限制为读取的长度,但事实上数据最后有很多空值。

      以上就是c/c++开发分享通过C中的argv使用管道发送和接收字符数组相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/519115.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐