导航:首页 > 程序命令 > c连接linux命令

c连接linux命令

发布时间:2022-08-20 11:45:10

1. 如何在C语言编程中调用linux系统终端下的命令

根据调用需求,可以分为两种:

一、仅执行系统命令,不需要该命令的打印结果。

这种情况可以用system函数。形式为

system(cmd);

其中cmd为char*类型的字符串,包含要执行的命令,命令的执行结果会输出到标准输出。

比如

system("mkdirtest");

这个执行,会在当前文件夹下创建test文件夹。

二、需要命令执行的打印。

虽然同样可以使用system并重定向到文件,然后打开文件读取,最终删除文件。但这样做比较繁琐,更好的做法是使用popen。

FILE *fp = popen(cmd);

执行cmd中的命令,然后可以以C文件操作方式,读取命令的输出结果。比如:

if((fp=popen("pwd","r"))==NULL)//执行获取当前目录的系统命令pwd。
{
printf("执行失败 ");//fp为NULL表示命令执行失败。
}
else
{
chars[100];
while(fgets(s,100,fp))//获取文件内容。
printf("%s",s);//输出结果。
pclose(fp);//关闭。
}

2. 通过几个简单的Linux命令,深入理解c语言编

主要使用gcc命令以及以下几个参数:

-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>

环境配置好以后,让我们开始c语言的编译之旅吧~

编写c语言源代码
很多linux命令都可以新建一个文件,比如

$ touch test.c

建立一个空白的文件

$ vim test.c

使用vim(文本编辑器)编辑test.c,如果test.c不存在,则创建

$ echo "123" > test.c

通过输出重定向新建一个文件

创建完test.c后,将下面这段Hello World代码写到test.c中(很多方法)

#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}

写完之后可以使用ls命令来查看当前目录下的文件,检查test.c是否存在

$ ls

使用cat命令查看test.c中的内容,检查是否写入成功

$ cat test.c

ls-cat

展开头文件(预处理)
$ gcc -E test.c -o test_pre.c

这个命令把源代码test.c中的头文件展开,并把结果输出到test_pre.c

(可以使用cat或者vim命令查看test_pre.c文件中的内容)
per
test_pre.c中的内容是这样的,可以发现原本几行的代码变成了几百行,而且已经见不到include关键字了,取而代之的是一些变量定义的代码,这些代码就是stdio.h中的内容,和stdio.h中头文件展开后的内容。

编译
$ gcc -S test_pre.c -o test_asm.s

这一条命令将上一步预处理过后的源代码编译成为汇编代码

asm
现在看到的是test_asm.s里面的汇编代码。

什么是汇编?

汇编语言是汇编指令集、伪指令集和使用它们规则的统称,使用具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令。

简单的可以理解为汇编语言是一本词典,01100101011010这样的二进制字符串是单词,汇编指令是单词的含义。计算机能读懂二进制字符串,而人能读懂的是翻译过来的汇编指令。

汇编
$ gcc -c test_asm.s -o test_obj.o

这一步将test_asm.s汇编成为目标文件,目标文件中存储的就是010101010这样的字符串了,可以用cat命令试试去读取test_obj.o

obj

可以发现打印出来许多不可见的字符,原因是目标文件已经是二进制格式的了,不同于源代码(文本格式)

有关文件的格式可以看下这里的介绍:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

链接
链接器负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

这个例子中没有附加的目标文件,所以只需要目标文件做被链接的对象。

有关链接器的详细讲解大家可以看下这里:
https://www.hu.com/question/27386057

$ gcc test_obj.o -o hello

gcc本身可以充当链接器,这里使用gcc命令将目标文件test_obj.o链接成了可执行文件hello

ld

运行程序!
至此,源代码已经经历了预处理、编译、汇编、链接四步成为了可执行文件,现在试着运行一下这个程序吧

$ ./hello

hello

小结
首先我们创建了源文件test.c,然后用gcc -E将源文件中的头文件展开,这一步叫做预处理;
之后通过gcc -S将预处理后的源文件编译了汇编代码,这一步叫做编译;
接着使用gcc -c命令将汇编代码转换成了二进制的目标文件,这一步操作叫做汇编;
目标文件不同于源代码,是二进制格式,是源文件编译过程中产生的中间文件,通过链接器可以将多个目标文件链接成为可执行文件,这一步叫做链接。

源文件->(预处理->编译->汇编->链接)->可执行文件

一般大家所说的c语言编译,其实是上述这四步的简称。

3. 在linux环境下对c语言程序编译连接后执行该程序为什么在命令行中加./

./指的是当前目录,比如当前目录下有一个可执行文件setup,那么你需要用命令./setup来执行这个文件。如果直接用setup是不行的。为了区分可执行文件的名字和系统命令,需要这样的设定。
例如,你的可执行文件名为exit,那么你直接输入exit,系统是要退出呢?还是执行exit这个文件呢?系统会退出!这就是一个矛盾,而你输入./exit,那么系统就能够执行exit这个文件了。
希望对你有所帮助。

4. 怎么在 c 代码里 加入 linux 命令啊

system(const char*);

exec()等函数

5. 简述linux系统中,一个C语言的源程序从编辑,编译,连接一直到运行的步骤每一步用到的命令

编辑:linux下编辑器一大堆,随便那个编辑器都可以,比如我用的是vim,
vim first.c 在里面就可以编辑了
编译:我用的是gcc

vim first.c #edit
gcc -o first first.c #compile
./first #run

6. 如何在objective-c中调用linux命令

可以 直接执行命令

voidrunls()
{
[[:@"/bin/ls"
arguments:[NSArrayarray]]waitUntilExit];
}

或者 启动sh执行命令。

voidrunSystemCommand(NSString*cmd)
{
[[:@"/bin/sh"
arguments:[NSArrayarrayWithObjects:@"-c",cmd,nil]]
waitUntilExit];

7. linux下怎样用c语言调用shell命令

C程序调用shell脚本共同拥有三种法子 :system()、popen()、exec系列数call_exec1.c ,
system() 不用你自己去产生进程。它已经封装了,直接增加自己的命令
exec 须要你自己 fork 进程,然后exec 自己的命令

popen() 也能够实现运行你的命令,比system 开销小

方法一、system()的使用。我直接上代码吧

int system(const char *command);

我在/home/book/shell新建一个test.sh文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash
echo $HOME
echo "the is test!"</span></span>

test.c文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>

int main()
{
system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路径前面要加上bash */
return 0;
}</span></span>

运行例如以下命令来编译:
<span style="font-size:18px;">gcc test.c -o test
</span>

测试命令:

<span style="font-size:18px;">./test</span>

结果例如以下:

<span style="font-size:18px;">/root
the is test!</span>

方法二:popen() 会调用fork()产生 子历程,然后从子历程中调用/bin/sh -c来履行 参数command的指令。参数type可应用 “r”代表读取。“w”代表写入。遵循此type值。popen()会建立 管道连到子历程的标准 输出设备 或标准 输入设备 ,然后返回一个文件指针。
随后历程便可利用 此文件指针来读取子历程的输出设备 或是写入到子历程的标准 输入设备 中。此外,全部应用 文 件指针(FILE*)操作的函数也都能够应用 ,除了fclose()以外。

返回值:若成功 则返回文件指针,否则返回NULL,差错 原因存于errno中。注意:在编写具SUID/SGID权限的程序时请尽量避免应用 popen()。popen()会继承环境变量。通过环境变量可能会造成系统安全的问题

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

其它不用改变我们直接改动test.c文件:

#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/book/shell/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}

方法三:exec函数簇 (我不太懂,别人的。也没有验证。习惯方法一)
须要注意的是exec并非1个函数, 事实上它仅仅是一组函数的统称, 它包含以下6个函数:

#include <unistd.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[];

能够见到这6个函数名字不同, 并且他们用于接受的参数也不同.
实际上他们的功能都是几乎相同的, 由于要用于接受不同的参数所以要用不同的名字区分它们, 毕竟c语言没有函数重载的功能嘛..

可是实际上它们的命名是有规律的:
exec[l or v][p][e]

exec函数里的参数能够分成3个部分, 运行文件部分, 命令参数部分, 环境变量部分.
比如我要运行1个命令 ls -l /home/gateman

运行文件部分就是 "/usr/bin/ls"
命令参赛部分就是 "ls","-l","/home/gateman",NULL 见到是以ls开头 每1个空格都必须分开成2个部分, 并且以NULL结尾的啊.
环境变量部分, 这是1个数组,最后的元素必须是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};

好了说下命名规则:
e兴许, 参数必须带环境变量部分, 环境变零部分参数会成为运行exec函数期间的环境变量, 比较少用
l 兴许, 命令参数部分必须以"," 相隔, 最后1个命令参数必须是NULL
v 兴许, 命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针. 比如char * pstr就是1个字符串的指针, char * pstr[] 就是数组了, 分别指向各个字符串.

关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html

p兴许, 运行文件部分能够不带路径, exec函数会在$PATH中找

还有1个注意的是, exec函数会代替运行它的进程, 也就是说, 一旦exec函数运行成功, 它就不会返回了, 进程结束. 可是假设exec函数运行失败, 它会返回失败的信息, 并且进程继续运行后面的代码!

通常exec会放在fork() 函数的子进程部分, 来替代子进程运行啦, 运行成功后子程序就会消失, 可是运行失败的话, 必须用exit()函数来让子进程退出!

8. 如何在linux下的C里调用系统命令,等同输入命令

system(执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include 定义函数 int system(const char * string); 函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。 返回值 如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。 附加说明 在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。 范例 #includemain(){system(“ls -al /etc/passwd /etc/shadow”);} 执行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow如何在linux下的C里调用系统命令,等同输入命令

9. 在Linux系统中,如何运行一个C语言程序

1、打开kali linux的终端。创建一个文件并命名为test.c。在终端输入:touch test.c。

阅读全文

与c连接linux命令相关的资料

热点内容
煎饼解压视频教程全集 浏览:339
平行线pdf 浏览:631
android锁屏不退出程序运行 浏览:635
sap连接的服务器地址是 浏览:426
linuxshell脚本从入门到精通 浏览:725
python进制均值 浏览:629
pdfformac 浏览:316
用虚拟服务器是什么目的 浏览:192
压缩机阿里巴巴 浏览:637
主图指标源码回踩 浏览:161
怎么验证服务器端口 浏览:612
如何添加密码卡 浏览:671
2021好声音在哪个app观看 浏览:126
压缩层计算深度 浏览:391
爱奇艺怎么不能源码输出 浏览:834
小孩视力训练app哪个好 浏览:831
表格上加密码 浏览:202
服务器如何调时间 浏览:417
安卓怎么跟踪对方苹果手机位置 浏览:832
pptp服务器地址怎么设置 浏览:941