Partager un descripteur de fichier entre le parent et l'enfant après fork et exec
J'ai deux processus sous Linux, Un & B.
Je veux partager le descripteur de fichier de processus A processus B, maintenant je viens de sérialiser un char*
et le passer à la execl
paramètres, mais qui ne fonctionne pas.
A. c ressemble à ceci:
union descriptor{
char c[sizeof(int)];
int i;
} fd;
pid_t pid;
fd.i = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//Perform other socket functions
pid = fork();
if(pid == 0){
//Read data from socket
if(execl("./B", fd.c, NULL) < 0){
exit(EXIT_FAILURE);
}else(
exit(EXIT_SUCCESS);
}
}else if(pid < 0){
exit(EXIT_FAILURE);
}else{
waitpid(pid, NULL, 0);
}
B. c ressemble à ceci:
union descriptor{
char c[sizeof(int)];
int i;
} fd;
memcpy(&fd.c[0], argv[0], sizeof(int));
write(fd.i, "TEST", 4);
close(fd.i);
Mais cela ne fonctionne pas, et je ne comprends vraiment pas pourquoi pas. Comment puis-je faire ce travail? Et si ça marche, est-il la meilleure solution pour partager un descripteur de fichier entre un parent et un enfant après un fork
et un exec
?
Mise à jour
Le problème n'est pas lié à la question que j'avais posée, elle est causée par une mauvaise façon de passer un entier comme l'a souligné @OliCharlesworth. Veuillez fermer cette question.
argv[0]
?.....- Aussi, vous êtes à l'aide de
strcpy
sur des données binaires? argv[0]
est le fichier de descripteur de passé parexecl
.- J'ai peut-être tort, mais argv[0] doit être le nom du processus, essayez de argv[1] Suivez @OliCharlesworth suggestion, et appeler un memcpy pour copier sizeof(int) octets au lieu d'un strcpy (que pourrait-elle conduit à une ERREUR de segmentation)
- Non, c'est en fait
argv[0]
, j'ai testé que. Et @OliCharlesworth j'ai fait un edit pour lestrcpy
. - Ok, dans l'avenir, lorsque vous demandez à propos de problèmes avec un peu de code, s'il vous plaît être sûr d'afficher le code réel, mot à mot, pas quelque chose de ce genre-de-est-comme-le-code, pour éviter les distractions inutiles.
- Oui, je suis désolé, j'ai oublié ce détail; je ne veux pas encombrer la question avec code inutile.
- Aussi,
execl
attend des arguments qui sont de véritables chaînes, pas des données binaires arbitraires. Fondamentalement, je pense que vous devez d'abord confirmer le mécanisme de correctement obtenir la valeur d'un entier, d'un endroit à l'autre, et alors seulement vous soucier de la prise d'affaires. - Vous aviez raison au sujet d'obtenir le nombre entier à travers, j'ai corrigé ça et maintenant ça fonctionne. Je me sens tellement stupide..
- Toujours une expérience d'apprentissage utile, à droite? Je pense que d'ici la leçon est de résoudre un problème en morceaux, plutôt que dans un seul aller.
Vous devez vous connecter pour publier un commentaire.
File descriptors are always passed between a parent and child process
Lorsque vous
fork
un processus, les descripteurs de fichiers ouverts dans le parent(au moment de lafork()
) sont implicitement répercuté sur l'enfant. Il n'est pas nécessaire d'envoyer de façon explicite.Par exemple:
Le pseudo-code se présente comme suit:
Dans le processus de Un:
Dans le processus de l'enfant B que vous pouvez faire:
EDIT:
Dans le cas où les procédés sont différents, vous devez passer le descripteur de fichier explicitement. Cela se fait généralement en utilisant les Sockets de Domaine UNIX(Si vous utilisez Linux Saveurs). Pour le code lié à cette fin, vous pouvez voir cette réponse
Oui, c'est vrai que les descripteurs de fichier reste ouvert même après la fourche ou exec ou fork et exec.Vous avez seulement besoin de connaître la valeur de fd dans le nouveau processus de l'image qui a été remplacé en utilisant exec d'autre que mettre la fd sur celui qui est déjà connu à ce processus(ex:0,1,2). De sorte que vous pouvez le faire de deux façons:
La passation de la fd sur un standard de descripteurs de fichiers à l'aide de dup2(note:pour autant que je sais que vous serez incapable de réinitialisation de la norme descripteur de fichier pour lequel il a été effectivement connus pour)
Passage de la fd comme argument de chaîne pour l'une des 6 fonctions exec fait le travail
Donc je vous suggère d'utiliser la deuxième méthode dans le cas où si vous voulez standard fds restent
Ce sont les deux méthodes de mise en œuvre:
P1.c(à l'aide de l'argument en passant)
P1.c(à l'aide de dup2 0)
P2.c
dup2()
-- c'est inutile complexité et soit ferme implicitement connue et potentiellement utile descripteur ouvert, ou s'appuie sur des codée en dur hypothèses sur certains nombre magique et si oui ou non la cible descripteur peut-être déjà ouvert et en cours d'utilisation dans un autre but.