linux下用shell来编c程序

linux下用shell来编c程序,第1张

设计、编仿段辑、编译、连接以及运行一个C程序,从键盘输入一个字符串然后向屏幕输出这个字符串备芹誉。

输入C程序 main() { char a printf("please enter a char:")scanf("%s",&a) printf("%s",a)}

输入命令gcc -o char char.c 进行编译连接 生成一个char.c文件

输入./char 执行此文件

在键盘上输入一个字符 回车 即可看到刚刚输入的字符

2)设计、编辑、编译、连接以及运行一个C程序,从键盘输入一个字符串然后向屏幕输出这个字符串

设计、编辑C程序

#!/bin/sh

Read char a

$A=a

Echo $A

编译、连接gcc -o a a.c

执行 ./a

任意从键盘上输入amsn

结果屏幕输出:amsn

将上面SHELL程序后台运行。观察原C程序运行时输入输出情况

进入首局后台运行命令

#!/bin/sh

a.c &

/*author:Samsons

  date:2015.4.10*/

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#include <string.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/wait.h>

#define MAX(100)

#define LEN(100)

char *arglist[MAX]  //shell指令参数表

int num             //shell指令参数个数

int execute(char* arglist[])//执行外部命令

{

    int error

    error=execvp(arglist[0],arglist)

    if (error==-1) printf("failed\n")

    exit(1)

}

char* make(char *buf)//将字符串传入参数表内

{

    char *cp

    cp=malloc(strlen(buf)+1)

    if (cp==NULL)

    {

        fprintf(stderr,"no memory\n")

        exit(1)

    }

    strcpy(cp,buf)

    return cp

}

int my_system(char *buf,char *arglist[])//对于字符串进行分割

{

    int num,j,i,last

    char buffer[LEN]

    num=0

    i=0

    while (num<MAX)

    {

        if (buf[i]=='\n')

        {

            arglist[num]=NULL

            return num

        }

        if (buf[i]==' ') i++

        last=i

        while (buf[i]!=' ' && buf[i]!='\n') i++

        for (j=lastj<ij++) buffer[j-last]=buf[j]

        buffer[j-last]='\0'

        arglist[num++]=make(buffer)

    }

}

int inner(char *arglist[])//执行内置指令

{

    if (strcmp(arglist[0],"exit\0")==0)//exit

    {

        exit(0)

        return 1

    }

    else

    if (strcmp(arglist[0],"pwd\0")==0)//pwd

    {

        char buf[LEN]

        getcwd(buf,sizeof(buf))//获得当前目录

        printf("Current dir is:%s\n",buf)

        return 1

    }

    else

    if (strcmp(arglist[0],"cd\0")==0)//cd

    {

        char buf[LEN]

        if (chdir(arglist[1])>=0)

        {

            getcwd(buf,sizeof(buf))

            printf("Current dir is:%s\n",buf)

        }

        return 1

    }

    else return 0

}

void cat_in(char *q)//输入重定向

{

    char t[30]

    int fd

    if (q[0]=='<')

    {

        strcpy(t,q+1)

        fd=open(t,O_RDONLY)

        arglist[1]=NULL

        if (fd==-1)

        {

            printf("file open failed\n")

            return

      塌锋  }

        dup(fd,0)

        close(fd)

    }

}

void cat_out(char *q)//输出重定向

{

    char t[30]

    int fd

    if (q[0]=='>')

    {

      团码晌  strcpy(t,q+1)

        arglist[num-1]=NULL

        num--

        fd=open(t,O_CREAT|O_RDWR)

        if (fd==-1)

        {

            printf("file open failed\n")

            return

        }

        dup2(fd,1)

        close(fd)

    }

}

int main()

{

    int i,pid

    char buf[LEN]

    while (1)

    {

        fgets(buf,LEN,stdin)//读入单行指令

        num=my_system(buf,arglist)//指令分割

        int inner_flag

        inner_flag=inner(arglist)//内置指令判断

        if (inner_flag==0)

        {

            pid=fork()//建立新的进程

            if (pid==0)

            {

                if (arglist[1]!=NULL)

                {

                    char q[LEN]

                    strcpy(q,arglist[1])

                    cat_in(q)//输入重定向

                }

                if (arglist[num-1]!=NULL)

                {

                    char q[LEN]

 模空                   strcpy(q,arglist[num-1])

                    cat_out(q)//输出重定向

                }

                execute(arglist)//执行

            }

            waitpid(pid,NULL,0)

        }

    }

    return 0

}

在c语言中调�”.shell命令的方法实现。

c程序调用shell脚本共有两种方法

:system()、popen(),分别如下:

system()

不用自己去创建进程,系统已经封装了这一步,直接加入自己的命令即可

popen()

也可以实现执行的命令,比system

开销小

以下分别说明:

1)system(shell命令或shell脚本路径斗消运)

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

来确认履行

成功

。

system命令以其简略

高效的作用得到很很广泛

的利用

,下面是一个例子

例:在/tmp/testdir/目录下有shell脚本tsh.sh,内容为

#!/bin/sh

wget

$1

echo

"done!"

2)popen(char

*command,char

*type)

popen()

会调用fork()产生

子历程,然后从子历程中调用/bin/sh

-c来履行

参数command的指令。参数type可应用

“r”代表读取,“w”代表写入。遵循此type值,popen()会建立

管道连到子历程的标准

输出设备

或标准

输入设备

,然后返回一个文件指针。随后历程便可利用

此文件指针来读取子历程的输出设备

或是写入到子历程的标准

输入设备

中。此外,所有应用

文

件指针(file*)操作的函数也都可以应用

,除了fclose()以桥郑外。

返回值:若成功

则返回文件指针,否则返回null,差错

原因存于errno中。注意:在编写具suid/sgid权限的程序时请尽量避免应用

popen(),popen()会继承环境变量,通过环境变量可能会造成系统安全的问题。

例:c程序popentest.c内容如下:

#include

main

{

file

*

fp

charbuffer[80]

fp=popen(“~/myprogram/test.sh”,”r”)

fgets(buffer,sizeof(buffer),fp)

printf(“%s”,buffer)

pclose(fp)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12382471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存