如何在C语言编程中调用linux系统终端下的命令system(执行shell 命令)
相关函数 fork,execve , waitpid,popen
表头文件 #includestdlib.h
定义函数 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()会继承环境变量,通过环境变量可能会造成系统安全的问题 。
范例 #includestdlib.h
main()
{
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
怎么用C语言实现linux的命令命令是查询当前登录的每个用户,它的输出包括用户名、终端类型、登录日期及远程主机,在Linux系统中输入who命令输出如下:
我们先man一下who , 在帮助文档里可以看到,who命令是读取/var/run/utmp文件来得到以上信息的 。
我们再man一下utmp , 知道utmp这个文件,是二进制文件,里面保存的是结构体数组,这些数组是struct utmp结构体的 。
struct utmp {
shortut_type;
pid_tut_pid;
charut_line[UT_LINESIZE];
charut_id[4];
charut_user[UT_NAMESIZE];
charut_host[UT_HOSTSIZE];
struct {
int32_t tv_sec;
int32_t tv_usec;
} ut_tv;
/***等等***/
};
要实现who只需要把utmp文件的所有结构体扫描过一遍,把需要的信息显示出来就可以了 , 我们需要的信息有ut_user、ut_line、ut_tv、ut_host 。
老师给的初始代码:who1.c运行结果如下:
需要注意的是utmp中所保存的时间是以秒和微妙来计算的,所以我们需要把这个时间转换为我们能看懂的时间,利用命令man -k time | grep 3搜索C语言中和时间相关的函数:
经过搜索发现了一个ctime()函数,似乎可以满足我们的需求,于是对代码中关于时间的printf进行修改:
printf("%s",ctime(utbufp-ut_time));
编译运行发现出来的结果虽然已经转换成了我们能看懂的时间格式,但是很明显这个时间是错的:
搜索一下ut_time这个宏,发现它被定义为int32_t类型:
但是ctime()函数中要求参数的类型是time_t类型,所以重新定义一下类型,编译运行之后,发现时间已经改成了正确的,但是发现()中的内容被换行了 , 猜想ctime()函数的返回值可能自动在最后补了一个字符\n:
一开始想通过\r\b来实现“退行”,但实践后发现并不可取,最后考虑到直接修改字符串中最后一个字符为\0 , 让其字符串结束 , 使输出达到与系统who命令一样的效果,即在输出语句前添加如下代码:
cp[strlen(cp)-1] = '\0'
最后编译执行效果 , 发现解决了该问题:
虽然能看出基本上和who指令的执行结果一致,但是并非完全一样,主要在两点,第一是时间格式不一样,第二个是比who执行的结果多了几条,需要注意的是utmp中保存的用户,不仅仅是已经登陆的用户,还有系统的其他服务所需要的“用户” , 所以在显出所有登陆用户的时候 , 应该过滤掉其他用户,只保留登陆用户 。我们可以通过ut_type来区别,登陆用户的ut_type是USER_PROCESS 。
先用if语句对执行结果进行过滤,效果如下:
接着解决时间格式问题,利用man命令收到了两个非常有用的函数:localtime()和strftime() , localtime()是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,strftime()则是用来定义时间格式的,如:年-月-日,利用这两个函数对时间进行修改后,结果显示终于和系统中who命令一模一样:
最终完整的代码如下:
#include stdio.h
#include stdlib.h
#include utmp.h
#include fcntl.h
#include unistd.h
#include time.h
#define SHOWHOST
void show_time(long timeval){
char format_time[40];
struct tm *cp;
cp = localtime(timeval);
strftime(format_time,40,"%F %R",cp);
printf("%s",format_time);
}
int show_info( struct utmp *utbufp )
{
if(utbufp-ut_type == USER_PROCESS){
printf("%-8.8s", utbufp-ut_name);
printf(" ");
printf("%-8.8s", utbufp-ut_line);
printf("");
show_time(utbufp-ut_time);
printf(" ");
#ifdefSHOWHOST
printf("(%s)", utbufp-ut_host);
#endif
printf("\n");
}
return 0;
}
int main()
{
struct utmpcurrent_record;
intutmpfd;
intreclen = sizeof(current_record);
if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
perror( UTMP_FILE );
exit(1);
}
while ( read(utmpfd, current_record, reclen) == reclen )
show_info(current_record);
close(utmpfd);
return 0;
}
linux怎么运行c文件linux怎么运行c文件呢c使用linux命令 , 下面就让我们来看看吧 。
1、安装gccg编译工具 。
2、创建一个后缀名为.cc使用linux命令的文件 。
3、打开文件c使用linux命令,准备编辑代码vimc.c.
4、编写一个简单的代码,包含头文件和main函数 。
5、在终端窗口中输入gccc.c-otest编译代码 。
6、输入./test命令回车即可 。
以上就是小编的分享,希望能帮助的大家 。
本文章基于ThinkpadE15品牌、centos7系统撰写的 。
怎么用linux写c语言Linux正在成为开发人员的编程天堂c使用linux命令,成为开源和免费操作系统 。Turbo C编译器已经是一种编译程序的旧方法c使用linux命令,所以让程序员转向Linux以获得新的编程环境 。在本文中c使用linux命令,我们将解释如何编写,编译和运行一个简单的C程序 。这将成为您迁移到可以在Linux上编写和执行的更复杂和有用的C程序的基础 。
我们在Ubuntu 18.04 LTS系统上运行了本文中提到的步骤和命令 。
我们将使用Linux命令行工具Terminal,以编译一个简单的C程序 。要打开终端,您可以使用Ubuntu Dash或CtrlAltT快捷方式 。
第1步:安装build-essential软件包
为了编译和执行C程序,您需要在系统上安装必要的软件包 。在Linux终端中以root用户身份输入以下命令:
sudo apt-get install build-essential
系统会要求您输入root用户密码; 安装过程将在此之后开始 。请确保您已连接到互联网 。
第2步:编写一个简单的C程序
安装必要的软件包之后,让我们编写一个简单的C程序 。
打开Ubuntu的图形文本编辑器,将以下示例程序写入或复制到其中:
#includestdio.h
int main()
{
printf("nA sample C program ");
return 0;
}
然后使用.c扩展名保存文件 。在这个例子中 , 我将我的C程序命名为linuxidc.c
或者 , 您可以通过gedit中的终端编写C程序,如下所示:
gedit linuxidc.c
这将创建一个.c文件,您可以在其中编写和保存程序 。
第3步:使用gcc编译C程序
在终端中,输入以下命令以生成您编写的程序的可执行版本:
句法:
$ gcc [programName].c -o programName
示例:
$ gcc linuxidc.c -o linuxidc
【c使用linux命令 linux c调用系统命令】关于c使用linux命令和linux c调用系统命令的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- CS单机游戏苹果,cs iphone
- sap中grir汇率差异,sap查汇率的tcode
- 卖美甲贴的主播直播怎么做,直播美甲贴的怎么拍摄
- c语言pow函数. c语言pow函数的参数类型
- sqlserver如何查询多列,sql查询多少列
- 新人如何踏足电商,新手怎么开始做电商
- 韩国vr直播平台,韩国vr直播平台推荐
- linux回到上一条命令 linux回到顶部命令
- 帮转视频号文案怎么写,视频号转发作者知道吗