操作系统 - 意外输出

时间:2016-04-02 17:27:51

标签: c operating-system

我在使用client.c读取用户提供的信息(2个整数和字符"+""-")的程序时遇到问题。然后使用execl系统调用,client.c将用户输入发送到server.c,其中计算两个整数之和或差。最后,结果将通过client.c系统调用传输到exitclient.c将打印该结果。

我面临的问题是,我没有得到我期望的结果(它总是打印0),我无法弄清楚原因。

client.c

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024
int main(int argc, char **argv)
{
    char buf1[MAXLINE];
    char buf2[MAXLINE];
    char buf3[MAXLINE];
    int childPid;
    pid_t pid;
    int status;
    int x,i,j,n;
    char c;
    x=1;
    n=0;
        while(x<=3){
        printf(">");

         if(x==1){
         fgets(buf1, MAXLINE, stdin);
         if(sscanf(buf1,"%i",&i)!=1){
            perror("eroare la citire i");
         }}
         if(x==2){
         fgets(buf2, MAXLINE, stdin);
         if(sscanf(buf2,"%i",&j)!=1){
         perror("eroare la citire j");}}
         if(x==3){
         fgets(buf3, MAXLINE, stdin);
         if(sscanf(buf3,"%c",&c)!=1){
         perror("eroare la citire c");}}
          x++;
          }
        if ((pid=fork()) < 0) {
            perror("Eroare fork");
            exit(1);
                }
         else if (pid == 0) {
         n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2",buf1,buf2,buf3,NULL);
         wait(&status);
        }
printf("%d" ,status);

}

server.c

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

int main(int arc,char **argv)
{
    int x,y,result;
    char c;
    if(sscanf(argv[1],"%i",&x)!=1){
        perror("eroare la citirea primului argument");

    }
    if(sscanf(argv[2],"%i",&y)!=1){
        perror("eroare la citirea celui de-al argument");

    }
    if(sscanf(argv[3],"%c",&c)!=1){
        perror("eroare la citirea celui de-al treilea argument");

    }
    if(c=='+')
        result=x+y;
    if(c=='-')
        result=x-y;
    printf("%d",result);
    exit(result);
}

1 个答案:

答案 0 :(得分:3)

您使用错误的参数数量调用execl

来自execl man

  

execl(),execlp()中的const char * arg和后续省略号,   和execle()函数可以被认为是arg0,arg1,...,argn。   他们一起描述了一个或多个指针的列表   以null结尾的字符串,表示可用的参数列表   执行的程序。 按照惯例,第一个论点应该指出   与正在执行的文件关联的文件名。 列表   参数必须由NULL指针终止,因为它们是   可变参数函数,必须将此指针强制转换为(char *)NULL。

除了传递可执行文件的路径外,参数列表还应以正在执行的文件的名称开头。来电将采用execl("/path", "filename", "arg1", "arg2", ...)

的形式

而不是:

n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2",buf1,buf2,buf3,NULL);

应该是:

n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2","Porblem1_2",buf1,buf2,buf3,NULL);

请注意"Porblem1_2"是在它的路径后面给出的。

此外,您使用wait传递“结果”的方式将无法按照我认为的方式运行,与status >> 8进行位移。