导航

fork和execv引起的读值问题

后来又遇见一次传值问题,结论如下:

传送的一定是字符串,除了末尾以'\0'结尾,中间也不能含0;提供2种解决方法,本身是数字可以加上'0',使用base64

 

---------

最终父进程代码

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

int main()
{
        char *argv[3];
        int size = 5;
        char p[] = "hello";
        char str[10];

        sprintf(str, "%d", size);
        argv[0] = str;
        argv[1] = p;
        argv[2] = NULL;

        pid_t pid = fork();

        if (pid == 0)
                execv("./abc", argv);
}

子进程代码

#include <stdio.h>


int main(int argc, char **argv)
{
        printf("argc %d\n", argc);

        printf("argv[0] %s, argv[1] %s\n", argv[0], argv[1]);


        return 0;
}

 

-------------------------

所以这个时候,就去想,平时执行程序时,argv是作为参数输入的,也就是说,其本质是字符串。

这里就不要想着玩指针了,玩死了都。

https://blog.csdn.net/phenixyf/article/details/81530738

itoa找不到,用sprintf

-----------------------

因为是fork的缘故,argv[0]的值是不一样的

怎么读可以读对,不知道

 

--------------------

 

gdb同时调试父子进程

set detach-on-fork off

i inferior

inferior 2

 

 

----------------------

 

父进程代码如下

int size = 5;
char p[] = "Hello";

char *argv[3];
pid_t pid;

argv[0] = (char *)&size;
argv[1] = p;
argv[2] = NULL;

pid = fork();

if (!pid) {
    execv("./heart", argv);    
}

子进程代码如下

int
main(int argv, char **argv)
{
    int size;
    char *p;

    size = *(int *)argv[0];
    p = argv[1];
}    

 

posted on 2021-05-11 09:40  toughcactus  阅读(82)  评论(0编辑  收藏  举报