Use of execl (Arguments)









up vote
-3
down vote

favorite












New to C.
So I have a program called test.c (doesnt need any arguments to start, compiled like this "
gcc test.c -o test")
I want to make my other program execute test
I know I have to use execl but I just cant understand the arguments in the execl function



execl( code here )










share|improve this question



















  • 2




    The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
    – tkausl
    Nov 11 at 1:55











  • its the syntaxe in writing the arguments
    – Ventura
    Nov 11 at 1:58














up vote
-3
down vote

favorite












New to C.
So I have a program called test.c (doesnt need any arguments to start, compiled like this "
gcc test.c -o test")
I want to make my other program execute test
I know I have to use execl but I just cant understand the arguments in the execl function



execl( code here )










share|improve this question



















  • 2




    The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
    – tkausl
    Nov 11 at 1:55











  • its the syntaxe in writing the arguments
    – Ventura
    Nov 11 at 1:58












up vote
-3
down vote

favorite









up vote
-3
down vote

favorite











New to C.
So I have a program called test.c (doesnt need any arguments to start, compiled like this "
gcc test.c -o test")
I want to make my other program execute test
I know I have to use execl but I just cant understand the arguments in the execl function



execl( code here )










share|improve this question















New to C.
So I have a program called test.c (doesnt need any arguments to start, compiled like this "
gcc test.c -o test")
I want to make my other program execute test
I know I have to use execl but I just cant understand the arguments in the execl function



execl( code here )







c execl






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 11 at 2:52

























asked Nov 11 at 1:53









Ventura

13




13







  • 2




    The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
    – tkausl
    Nov 11 at 1:55











  • its the syntaxe in writing the arguments
    – Ventura
    Nov 11 at 1:58












  • 2




    The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
    – tkausl
    Nov 11 at 1:55











  • its the syntaxe in writing the arguments
    – Ventura
    Nov 11 at 1:58







2




2




The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
– tkausl
Nov 11 at 1:55





The args are explained in the Docs. If this doesn't help please be specific which part you don't understand.
– tkausl
Nov 11 at 1:55













its the syntaxe in writing the arguments
– Ventura
Nov 11 at 1:58




its the syntaxe in writing the arguments
– Ventura
Nov 11 at 1:58












1 Answer
1






active

oldest

votes

















up vote
1
down vote



accepted










All the arguments to execle() except the last two are strings — the penultimate one is a null char * marking the end of the command line arguments, and the last is a char ** specifying the environment. The first is the pathname of the executable, relative to the current directory if the name does not start with a / slash. The second argument is the name of the program. Subsequent arguments are the extra arguments for the program (the list is terminated by a (char *)0 argument) and then there's a final argument that is the environment for the program (the trailing e indicates that the environment is passed). Hence, for example:



extern char **environ; // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);


You could use "teste" or "/bin/bash" in place of "pink elephants", depending on your tastes. Only two of the three program name options suggested are outright fibs. If you replace the environ argument with (char **)0 or equivalent, then the program is invoked with no environment variables, which is usually regarded as an abuse of the program that's run (rather like telling it that it's name is "pink elephants" rather than "teste" is an abuse of it).



You could use variables too:



const char *progname = "teste";

execle(progname, progname, (char *)0, environ);




Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.




It's impressive how many (small) problems there can be in a single simple line of code. Using execlp("./teste", NULL, NULL); is dubious on at least these counts:



  1. You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc.

  2. The first NULL is sufficient if you're not going to provide a name; the second is never processed.

  3. Using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have used execle("./teste", (char *)NULL, environ);.

  4. It's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle(). It's not a very likely problem, but #define NULL 0 is legitimate, and if sizeof(int) == 4 but sizeof(char *) == 8, then you could have difficulties.

Aside: you'll probably find the execv*() functions more useful in general than the execl*() functions. At least, my experience is that the variable length argument list is more often needed by the programs I run than a fixed length list.






share|improve this answer






















  • Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
    – Ventura
    Nov 11 at 2:17











  • Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
    – Jonathan Leffler
    Nov 11 at 2:22










  • execle("./teste", (char *) NULL); actually didnt work
    – Ventura
    Nov 11 at 2:30






  • 1




    @Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
    – Jonathan Leffler
    Nov 11 at 2:33











  • So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
    – Ventura
    Nov 11 at 2:42











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245178%2fuse-of-execl-arguments%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote



accepted










All the arguments to execle() except the last two are strings — the penultimate one is a null char * marking the end of the command line arguments, and the last is a char ** specifying the environment. The first is the pathname of the executable, relative to the current directory if the name does not start with a / slash. The second argument is the name of the program. Subsequent arguments are the extra arguments for the program (the list is terminated by a (char *)0 argument) and then there's a final argument that is the environment for the program (the trailing e indicates that the environment is passed). Hence, for example:



extern char **environ; // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);


You could use "teste" or "/bin/bash" in place of "pink elephants", depending on your tastes. Only two of the three program name options suggested are outright fibs. If you replace the environ argument with (char **)0 or equivalent, then the program is invoked with no environment variables, which is usually regarded as an abuse of the program that's run (rather like telling it that it's name is "pink elephants" rather than "teste" is an abuse of it).



You could use variables too:



const char *progname = "teste";

execle(progname, progname, (char *)0, environ);




Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.




It's impressive how many (small) problems there can be in a single simple line of code. Using execlp("./teste", NULL, NULL); is dubious on at least these counts:



  1. You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc.

  2. The first NULL is sufficient if you're not going to provide a name; the second is never processed.

  3. Using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have used execle("./teste", (char *)NULL, environ);.

  4. It's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle(). It's not a very likely problem, but #define NULL 0 is legitimate, and if sizeof(int) == 4 but sizeof(char *) == 8, then you could have difficulties.

Aside: you'll probably find the execv*() functions more useful in general than the execl*() functions. At least, my experience is that the variable length argument list is more often needed by the programs I run than a fixed length list.






share|improve this answer






















  • Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
    – Ventura
    Nov 11 at 2:17











  • Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
    – Jonathan Leffler
    Nov 11 at 2:22










  • execle("./teste", (char *) NULL); actually didnt work
    – Ventura
    Nov 11 at 2:30






  • 1




    @Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
    – Jonathan Leffler
    Nov 11 at 2:33











  • So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
    – Ventura
    Nov 11 at 2:42















up vote
1
down vote



accepted










All the arguments to execle() except the last two are strings — the penultimate one is a null char * marking the end of the command line arguments, and the last is a char ** specifying the environment. The first is the pathname of the executable, relative to the current directory if the name does not start with a / slash. The second argument is the name of the program. Subsequent arguments are the extra arguments for the program (the list is terminated by a (char *)0 argument) and then there's a final argument that is the environment for the program (the trailing e indicates that the environment is passed). Hence, for example:



extern char **environ; // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);


You could use "teste" or "/bin/bash" in place of "pink elephants", depending on your tastes. Only two of the three program name options suggested are outright fibs. If you replace the environ argument with (char **)0 or equivalent, then the program is invoked with no environment variables, which is usually regarded as an abuse of the program that's run (rather like telling it that it's name is "pink elephants" rather than "teste" is an abuse of it).



You could use variables too:



const char *progname = "teste";

execle(progname, progname, (char *)0, environ);




Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.




It's impressive how many (small) problems there can be in a single simple line of code. Using execlp("./teste", NULL, NULL); is dubious on at least these counts:



  1. You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc.

  2. The first NULL is sufficient if you're not going to provide a name; the second is never processed.

  3. Using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have used execle("./teste", (char *)NULL, environ);.

  4. It's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle(). It's not a very likely problem, but #define NULL 0 is legitimate, and if sizeof(int) == 4 but sizeof(char *) == 8, then you could have difficulties.

Aside: you'll probably find the execv*() functions more useful in general than the execl*() functions. At least, my experience is that the variable length argument list is more often needed by the programs I run than a fixed length list.






share|improve this answer






















  • Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
    – Ventura
    Nov 11 at 2:17











  • Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
    – Jonathan Leffler
    Nov 11 at 2:22










  • execle("./teste", (char *) NULL); actually didnt work
    – Ventura
    Nov 11 at 2:30






  • 1




    @Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
    – Jonathan Leffler
    Nov 11 at 2:33











  • So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
    – Ventura
    Nov 11 at 2:42













up vote
1
down vote



accepted







up vote
1
down vote



accepted






All the arguments to execle() except the last two are strings — the penultimate one is a null char * marking the end of the command line arguments, and the last is a char ** specifying the environment. The first is the pathname of the executable, relative to the current directory if the name does not start with a / slash. The second argument is the name of the program. Subsequent arguments are the extra arguments for the program (the list is terminated by a (char *)0 argument) and then there's a final argument that is the environment for the program (the trailing e indicates that the environment is passed). Hence, for example:



extern char **environ; // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);


You could use "teste" or "/bin/bash" in place of "pink elephants", depending on your tastes. Only two of the three program name options suggested are outright fibs. If you replace the environ argument with (char **)0 or equivalent, then the program is invoked with no environment variables, which is usually regarded as an abuse of the program that's run (rather like telling it that it's name is "pink elephants" rather than "teste" is an abuse of it).



You could use variables too:



const char *progname = "teste";

execle(progname, progname, (char *)0, environ);




Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.




It's impressive how many (small) problems there can be in a single simple line of code. Using execlp("./teste", NULL, NULL); is dubious on at least these counts:



  1. You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc.

  2. The first NULL is sufficient if you're not going to provide a name; the second is never processed.

  3. Using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have used execle("./teste", (char *)NULL, environ);.

  4. It's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle(). It's not a very likely problem, but #define NULL 0 is legitimate, and if sizeof(int) == 4 but sizeof(char *) == 8, then you could have difficulties.

Aside: you'll probably find the execv*() functions more useful in general than the execl*() functions. At least, my experience is that the variable length argument list is more often needed by the programs I run than a fixed length list.






share|improve this answer














All the arguments to execle() except the last two are strings — the penultimate one is a null char * marking the end of the command line arguments, and the last is a char ** specifying the environment. The first is the pathname of the executable, relative to the current directory if the name does not start with a / slash. The second argument is the name of the program. Subsequent arguments are the extra arguments for the program (the list is terminated by a (char *)0 argument) and then there's a final argument that is the environment for the program (the trailing e indicates that the environment is passed). Hence, for example:



extern char **environ; // No header declares this!

execle("teste", "pink elephants", (char *)0, environ);


You could use "teste" or "/bin/bash" in place of "pink elephants", depending on your tastes. Only two of the three program name options suggested are outright fibs. If you replace the environ argument with (char **)0 or equivalent, then the program is invoked with no environment variables, which is usually regarded as an abuse of the program that's run (rather like telling it that it's name is "pink elephants" rather than "teste" is an abuse of it).



You could use variables too:



const char *progname = "teste";

execle(progname, progname, (char *)0, environ);




Ended up using execlp and just writing execlp("./teste",NULL,NULL); only solution that worked.




It's impressive how many (small) problems there can be in a single simple line of code. Using execlp("./teste", NULL, NULL); is dubious on at least these counts:



  1. You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc.

  2. The first NULL is sufficient if you're not going to provide a name; the second is never processed.

  3. Using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have used execle("./teste", (char *)NULL, environ);.

  4. It's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle(). It's not a very likely problem, but #define NULL 0 is legitimate, and if sizeof(int) == 4 but sizeof(char *) == 8, then you could have difficulties.

Aside: you'll probably find the execv*() functions more useful in general than the execl*() functions. At least, my experience is that the variable length argument list is more often needed by the programs I run than a fixed length list.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 11 at 3:23

























answered Nov 11 at 2:12









Jonathan Leffler

555k886611013




555k886611013











  • Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
    – Ventura
    Nov 11 at 2:17











  • Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
    – Jonathan Leffler
    Nov 11 at 2:22










  • execle("./teste", (char *) NULL); actually didnt work
    – Ventura
    Nov 11 at 2:30






  • 1




    @Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
    – Jonathan Leffler
    Nov 11 at 2:33











  • So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
    – Ventura
    Nov 11 at 2:42

















  • Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
    – Ventura
    Nov 11 at 2:17











  • Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
    – Jonathan Leffler
    Nov 11 at 2:22










  • execle("./teste", (char *) NULL); actually didnt work
    – Ventura
    Nov 11 at 2:30






  • 1




    @Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
    – Jonathan Leffler
    Nov 11 at 2:33











  • So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
    – Ventura
    Nov 11 at 2:42
















Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
– Ventura
Nov 11 at 2:17





Ended up using execlp and just writting execlp './teste",NULL,NULL' only solution that worked
– Ventura
Nov 11 at 2:17













Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
– Jonathan Leffler
Nov 11 at 2:22




Using execlp("./teste", NULL, NULL); is dubious on at least three counts: (1) You've not provided the executed program with its name, which is discourteous at best and leads to unhelpful error reports, etc, and (2) the first NULL is sufficient if you're not going to provide a name; the second is never processed, and (3) using "./teste" means that the p (path search) part of execlp() is never exercised; you might as well have use execle("./teste", (char *)NULL); — and (4) it's not impossible for NULL not to translate to (char *)0 in a variable argument list like with execle().
– Jonathan Leffler
Nov 11 at 2:22












execle("./teste", (char *) NULL); actually didnt work
– Ventura
Nov 11 at 2:30




execle("./teste", (char *) NULL); actually didnt work
– Ventura
Nov 11 at 2:30




1




1




@Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
– Jonathan Leffler
Nov 11 at 2:33





@Ventura: Yes, it wouldn't; I forgot that the e in execle() means 'environment is passed' and execle("./teste", (char *)NULL); doesn't provide the environment. My bad — I'm sorry. I've fixed the answer. However, using execlp() is pointless when there's a slash in the string in the first argument — the program name. The PATH is never searched then. POSIX gives the synopsis: int execle(const char *path, const char *arg0, ... /*, (char *)0, char *const envp*/); for the function. Note the use of (char *)0 explicitly.
– Jonathan Leffler
Nov 11 at 2:33













So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
– Ventura
Nov 11 at 2:42





So what would you say its the best approach to solve this problem knowing that this teste.c is in only one directory The path should be something like /directory/test.c
– Ventura
Nov 11 at 2:42


















 

draft saved


draft discarded















































 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53245178%2fuse-of-execl-arguments%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

Barbados

How to read a connectionString WITH PROVIDER in .NET Core?

Node.js Script on GitHub Pages or Amazon S3