/ / Schreiben in eine Pipe in einem Child-Prozess, der von execl-c, exec und file-descriptor aufgerufen wird

Schreiben in eine Pipe in einem untergeordneten Prozess, der von execl - c, exec, file-descriptor aufgerufen wird

Ich verstehe nicht, wie man das Erschaffene benutzt pipe von mp.c im child process sp.c. Ich (glaube ich) kann scheinbar nicht richtig zugreifen file descriptor beim Benutzen execl für den Außenprozess.

   /***************mp.c*****************/

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

int main(int argc, char *argv[]) {
char  *procpath = "/mypath/sp";
char  *procname = "sp";
pid_t pid;
int fd[2];
int ret;
char buf[20];
memset(&buf[0], 0, sizeof(buf));
ret = pipe(fd);
if(ret == -1){
perror("pipe");
exit(1);
}
pid = fork();
printf("%dn",pid);
if (pid == 0){
//dup2(mypipefd[1],STDOUT_FILENO);
ret = execl(procpath, procpath, "1","2",NULL);
perror("execl failed to run slave program");
exit(1);
}
else if (pid > 0){
/* Parent process*/
printf("execl ret val = %d",ret);
printf("Parent process n");
close(fd[1]);
read(fd[0],buf,15);
//  close(fd[1]);
close(fd[0]);
printf("buf: %s TESTn", buf);
printf("buf: %s TESTn", buf);
}
else{
printf("call to fork failed, no childn");
exit(-1);
}
exit(0);
}

und der erstellte Prozess ...

/***************sp.c*****************/

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

int main(int argc, char *argv[]){
int ret;
//printf("Child process n");
int fd[2];
pipe(fd);
//dup2(fd[1],1);
//int out;
/*ret = dup2(fd[1],1);
if (ret = -1){
printf("%sn", strerror(errno));
};*/
//sprintf()
//printf("%dn", ret);
//mypipefd = argv[1];
printf("Child process n");
//close(fd[0]);
write(fd[1], "Hello there!",12);
close(fd[1]);
exit(0);
}

Antworten:

0 für die Antwort № 1

Das Problem ist, dass Sie ein anderes erstellenRohr in jeder Anwendung. Um über eine Pipe korrekt zu kommunizieren, sollten sich zwei Programme dieselbe Pipe teilen (eines der von der Pipe-Funktion erzeugten Dateideskriptoren).

Um dieses Problem zu lösen, müssen Sie im Grunde erstellendie Pipe in einer Anwendung und senden Sie die Dateideskriptor an das andere Programm, ohne die Systemaufrufpipe erneut aufzurufen. Ein Dateideskriptor kann mithilfe einer Socket-Unix-Domäne an einen anderen Prozess gesendet werden. Schau dir diesen Beitrag an Kann ich eine Dateibeschreibung für einen anderen Prozess unter Linux freigeben oder sind sie lokal für den Prozess?.