Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 双向管道通信。不能从孩子身上花钱_C_Fork - Fatal编程技术网

C 双向管道通信。不能从孩子身上花钱

C 双向管道通信。不能从孩子身上花钱,c,fork,C,Fork,我无法让这种基本的交流发挥作用。 我只想通过孩子的标准输出将信息发送到父母的文件描述符。 我有seg故障 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define READ 0 #define WRITE 1 int main(void){ int fdRead[2]; int pid, i, num; FILE* output; char mystring [100]

我无法让这种基本的交流发挥作用。 我只想通过孩子的标准输出将信息发送到父母的文件描述符。 我有seg故障

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define READ 0
#define WRITE 1 
int main(void){


int fdRead[2];
int pid, i, num;
FILE* output;   

char mystring [100];
char c;

 pid = fork();
 if(pid){
  FILE * read;
  close(fdRead[WRITE]); 
  read = fdopen(fdRead[READ], "r");       
  fgets(mystring,100, read);
  printf("parent %d",mystring );
 } else {
 /* child */    
     dup2(fdRead[WRITE], STDOUT_FILENO);
     close(fdRead[READ]);    
     close(fdRead[WRITE]);


     printf("child" );


 }
 exit(0);

}

您的代码对管道没有任何作用。 使用管道在父进程和子进程之间进行通信的代码如下

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define READ 0
#define WRITE 1 

int main(void){
    int pipefd[2];
    pid_t pid;
    int i, num;

    if (pipe(pipefd)<0) { /* create pipe */
        perror("pipe");
        exit(-1);
    }   

    char mystring [100];
    char c;

    pid = fork();
    if(pid<0){
        perror("fork");
        exit(-1);
    } else if (pid=1) { /* parent */
        char *mystring = "message to child";
        write(pipefd[WRITE],mystring,strlen(mystring);
        sleep(1); /* wait for child read message */
        char buf[128]; /* buffer to receive data from child */
        read(pipefd[READ],buf, sizeof buf);
        close(pipefd[READ]);
        close(pipefd[WRITE]);
        printf("Returned from child %s",buf );
        return 0;
    } else { /* child */
        char *s="send from child: ";
        char buf[128];
        read(pipefd[READ],buf, sizeof buf);
        write(pipefd[WRITE],s,strlen(s));
        close(pipefd[READ]);
        close(pipefd[WRITE]);
        return 0;
    }
}

尝试在启用警告的情况下编译-Wall-Wextra for gcc和clang。首先修复您收到的警告。与使用未初始化的数组类似。出现段错误的原因是read=fdopenfdRead[read],r;read为NULL,它在fgetsmystring,100,read;,处转储,在fget之前检查一下。如果有一个coredump,使用gdb调试它,并且在操作fdRead之前不创建管道