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é par execl.
  • 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 le strcpy.
  • 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.

InformationsquelleAutor tversteeg | 2014-02-02