Pass File Descriptor - Execve (typecast)

后端 未结 1 1542
北海茫月
北海茫月 2021-01-17 00:52

I am wondering how I can pass a file descriptor through the execve() command and then access it on the other side. I know that I can use dup2 to re

1条回答
  •  囚心锁ツ
    2021-01-17 01:35

    Simply casting the file descriptor to a char* isn't a good idea. It could cause data loss if the OS chooses to copy the strings and stops at the 0 bytes, so the data isn't entirely copied. It would be safer to create a string containing the file descriptor.

    int pfd[2];
    if(pipe(pfd) == -1)
        exitWithError("PIPE FAILED", 1);
    char string1[12]; // A 32 bit number can't take more than 11 characters, + a terminating 0
    snprintf(string1,12,"%i",pfd[1]); // Copy the file descriptor into a string
    char *args_1[] = {"reader", argv[1], &string1[0], (char *) 0};
    

    The reader program then uses atoi to convert this back into an int.

    int fd = atoi(argv[2]);
    write(fd,buf,read_test);
    

    If you really want to use a cast, then you need to cast argv[2] as int* in your reader.

    write(((int*)argv[2])[1],buf,read_test);
    

    0 讨论(0)
提交回复
热议问题